两个定时任务,第一个定时任务写逻辑计算第二个定时任务。问题是在第二个任务执行时调用接口报错先来报错:这步报错是在调用sevice层方法时报错,感觉很奇怪,求大佬解决
Job DEFAULT.testJob threw an unhandled Exception:
java.lang.NullPointerException
at cn.com.zyedu.quartz.task.liveTimingTaskInfo.liveTimingInfo(liveTimingTaskInfo.java:43)
at cn.com.zyedu.quartz.task.liveTimingTaskInfo.execute(liveTimingTaskInfo.java:26)
at org.quartz.core.JobRunShell.run(JobRunShell.java:213)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:557)
上代码:
配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">
<!-- quartz定时任务配置 -->
<bean id="scheduler"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<!-- 加入直播是否提前时间配置和时间配置内容 -->
<ref bean="liveTimingStatusTaskTrigger" />
</list>
</property>
</bean>
<!-- 直播判断是否触发提前时间配置 每日下午18:00分执行一次 -->
<bean id="liveTimingStatusTaskTrigger"
class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail">
<ref bean="liveTimingStatusDetail" />
</property>
<property name="cronExpression" value="00 36 09 26 05 ? 2021" />
<!-- <property name="cronExpression" value="0 0 18 * * ?" /> -->
</bean>
<bean id="liveTimingStatusDetail"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!-- 调用直播定时类 -->
<property name="targetObject">
<ref bean="liveTimingTask" />
</property>
<!-- 调用直播类中的方法 -->
<property name="targetMethod">
<value>liveTimingStatus</value>
</property>
<property name="concurrent" value="false" />
</bean>
<!-- 注入直播类 -->
<bean id="liveTimingTask"
class="cn.com.zyedu.quartz.task.liveTimingTask"></bean>
</beans>
java类:
第一个定时任务
package cn.com.zyedu.quartz.task;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import javax.annotation.Resource;
import org.quartz.*;
import org.quartz.impl.JobDetailImpl;
import org.quartz.impl.StdSchedulerFactory;
import org.quartz.impl.triggers.CronTriggerImpl;
import org.springframework.web.context.ContextLoader;
import org.springframework.web.context.WebApplicationContext;
import cn.com.zyedu.core.system.service.SysParamService;
public class liveTimingTask {
@Resource
public SysParamService sysParamService;
/**
* 每天18:00点定时启用功能判断是否开启直播配置
*
* @throws ParseException
* @throws SchedulerException
*/
public void liveTimingStatus() throws SchedulerException, ParseException{
String liveTimeStatus = sysParamService.getParamValueByParamKey("LIVE_TIME_STATUS", true);
if (null != liveTimeStatus && !"".equals(liveTimeStatus)) {
// 获取参数表是否开启直播数据 1开启0未开启
if ("1".equals(liveTimeStatus)) {
// 获取直播提前的时间配置
Integer liveAdvanceTiming = Integer
.valueOf(sysParamService.getParamValueByParamKey("LIVE_ADVANCE_TIMING", true));
if (null != liveAdvanceTiming && !"".equals(liveAdvanceTiming)) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Calendar nowTime = Calendar.getInstance();
// 当前时间固定20:00点
nowTime.set(nowTime.get(Calendar.YEAR), nowTime.get(Calendar.MONTH),
nowTime.get(Calendar.DAY_OF_MONTH), 20, 0, 0);
nowTime.add(Calendar.MINUTE, -liveAdvanceTiming);
String time1 = sdf.format(nowTime.getTime());
Date time2;
try {
time2 = sdf.parse(time1);
// date转换con时间
String cron = this.getCron(time2);
System.out.println("获取提前改变直播状态的时间"+cron);
// 构造调度器,使用标准调度器工厂获取默认的调度器
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.start();
JobDataMap dataMap = new JobDataMap();
dataMap.put("name", "live");
// 构造JobDetail,使用默认的JobDetailImpl类
JobDetailImpl detail = new JobDetailImpl();
detail.setJobClass(liveTimingTaskInfo.class);
detail.setJobDataMap(dataMap);
detail.setName("testJob");
// 构造Trigger,使用CronTrigger
CronTriggerImpl cronTrigger = new CronTriggerImpl();
cronTrigger.setCronExpression("00 16 17 26 05 ? 2021");// 如果仅需在指定时间执行一次任务,则表达式一般写法为:00 50 15 29 3 ? 2017(表示在2017-03-29 15:50:00执行任务)
//cronTrigger.setCronExpression(cron);
cronTrigger.setName("testTrigger");
// 调度任务
scheduler.scheduleJob(detail, cronTrigger);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
/***
* 日期转换cron表达式
*
* @param date
* @param dateFormat : e.g:yyyy-MM-dd HH:mm:ss
* @return
*/
public static String formatDateByPattern(Date date, String dateFormat) {
SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
String formatTimeStr = null;
if (date != null) {
formatTimeStr = sdf.format(date);
}
return formatTimeStr;
}
/***
* convert Date to cron ,eg. "0 07 10 15 1 ? 2016"
*
* @param date : 时间点
* @return
*/
public static String getCron(Date date) {
String dateFormat = "ss mm HH dd MM ? yyyy";
return formatDateByPattern(date, dateFormat);
}
}
第二个定时任务:
package cn.com.zyedu.quartz.task;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.annotation.Resource;
import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.util.CollectionUtils;
import cn.com.zyedu.core.education.model.Live;
import cn.com.zyedu.core.education.service.LiveService;
public class liveTimingTaskInfo implements Job {
@Resource
public LiveService liveService;
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
JobDataMap map = jobExecutionContext.getJobDetail().getJobDataMap();
System.out.println("更新直播间状态是否执行" + map.getString("name"));
this.liveTimingInfo();
}
/**
* 更新直播间状态,具体时间由liveTimingStatus方法赋予
*/
private void liveTimingInfo() {
// 获取当天直播的课程
Calendar calendar1 = Calendar.getInstance();
calendar1.set(calendar1.get(Calendar.YEAR), calendar1.get(Calendar.MONTH), calendar1.get(Calendar.DAY_OF_MONTH),
0, 0, 0);
Date beginOfDate = calendar1.getTime();
Calendar calendar2 = Calendar.getInstance();
calendar2.set(calendar2.get(Calendar.YEAR), calendar2.get(Calendar.MONTH), calendar2.get(Calendar.DAY_OF_MONTH),
23, 59, 59);
Date endOfDate = calendar2.getTime();
//就是在这步报错的,就大佬看看原因
List<Live> datas = liveService.selectNowLiveCourse(beginOfDate, endOfDate);
// 更新当天直播课程状态
if (!CollectionUtils.isEmpty(datas)) {
Live live = new Live();
for (Live item : datas) {
live.setIsavailable(1);
live.setLiveId(item.getLiveId());
liveService.updateLive(live);
}
System.out.println(new Date() + "执行任务");
}
}
}