这是报错信息:
java.lang.NullPointerException: null
at com.zl.school.business.controller.app.service.Quartz.ScheduleRefreshService.scheduleUpdateCronTrigger(ScheduleRefreshService.java:59) ~[classes/:na]
at sun.reflect.GeneratedMethodAccessor395.invoke(Unknown Source) ~[na:na]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_171]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_171]
at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84) ~[spring-context-5.1.7.RELEASE.jar:5.1.7.RELEASE]
at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) ~[spring-context-5.1.7.RELEASE.jar:5.1.7.RELEASE]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_171]
at java.util.concurrent.FutureTask.runAndReset$$$capture(FutureTask.java:308) [na:1.8.0_171]
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java) [na:1.8.0_171]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180) [na:1.8.0_171]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294) [na:1.8.0_171]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_171]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_171]
at java.lang.Thread.run(Thread.java:748) [na:1.8.0_171]
下面是jobdetail和 jobTrigger、scheduler
@Bean(name = "jobDetail")
public MethodInvokingJobDetailFactoryBean detailFactoryBean(ScheduledTask task){
MethodInvokingJobDetailFactoryBean jobDetail = new MethodInvokingJobDetailFactoryBean();
/*
* 是否并发执行
* 例如每5s执行一次任务,但是当前任务还没有执行完,就已经过了5s了,
* 如果此处为true,则下一个任务会执行,如果此处为false,则下一个任务会等待上一个任务执行完后,再开始执行
*/
jobDetail.setConcurrent(false);
//设置定时任务的名字
jobDetail.setName("srd-demo");
//设置任务的分组,这些属性都可以在数据库中,在多任务的时候使用
jobDetail.setGroup("srd");
//为需要执行的实体类对应的对象
jobDetail.setTargetObject(task);
/*
* sayHello为需要执行的方法
* 通过这几个配置,告诉JobDetailFactoryBean我们需要执行定时执行ScheduleTask类中的sayHello方法
*/
jobDetail.setTargetMethod("PushMessage");
System.out.println("jobDetail 初始化成功!");
return jobDetail;
}
@Bean(name = "jobTrigger")
public CronTriggerFactoryBean cronTriggerFactoryBean(MethodInvokingJobDetailFactoryBean jobDetail){
CronTriggerFactoryBean trigger = new CronTriggerFactoryBean();
trigger.setJobDetail(jobDetail.getObject());
trigger.setCronExpression("0/5 * * * * ?");
//trigger的name
trigger.setName("srd-demo");
System.out.println("jobTrigger 初始化成功!");
return trigger;
}
@Bean(name = "scheduler")
public SchedulerFactoryBean schedulerFactoryBean(Trigger trigger){
SchedulerFactoryBean factoryBean = new SchedulerFactoryBean();
//用于quartz集群,QuartzScheduler启动时更新已存在的job
factoryBean.setOverwriteExistingJobs(true);
//延时启动,应用启动1秒后
factoryBean.setStartupDelay(1);
//注册触发器
factoryBean.setTriggers(trigger);
System.out.println("scheduler 初始化成功!");
return factoryBean;
}
这是我要执行的任务
public void PushMessage() throws IOException {
system.out.println("这是要执行的任务");
}
下面是实现定时任务的方法
@Resource(name = "jobTrigger")
private CronTrigger cronTrigger;
@Resource(name = "scheduler")
private Scheduler scheduler;
@Resource
private MessageNoticeMapper messageNoticeMapper;
@Scheduled(fixedRate = 10000)
public void scheduleUpdateCronTrigger() throws SchedulerException {
CronTrigger trigger = (CronTrigger) scheduler.getTrigger(cronTrigger.getKey());
//当我启动服务时候,没有报错,然后去数据库取出第一次执行的时候,执行完后,tigger就会报空指针异常,这是为什么呢?
String currentCron = trigger.getCronExpression();
String searchCron = messageNoticeMapper.findOne(CommonStatic.NO, null);
if (currentCron.equals(searchCron)) {
// 如果当前使用的cron表达式和从数据库中查询出来的cron表达式一致,则不刷新任务
} else {
//表达式调度构建器
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(searchCron);
//按新的cronExpression表达式重新构建trigger
trigger = (CronTrigger) scheduler.getTrigger(cronTrigger.getKey());
trigger = trigger.getTriggerBuilder().withIdentity(cronTrigger.getKey()).withSchedule(scheduleBuilder).build();
// 按新的trigger重新设置job执行
scheduler.rescheduleJob(cronTrigger.getKey(), trigger);
}
}