Spring-引导 Quartz 作业不是 运行
Spring-Boot Quartz Job is not running
我刚开始以动态方式创建 Quartz Scheduled Jobs。所以有一个 QuartzConfig class,我在其中创建了 SchedulerFactoryBean
、JobDetailFactoryBean
和 CronTriggerFactoryBean
。其中 Job 和 CronTrigger bean 是原型 bean。
@Configuration
public class QuartzConfig {
@Autowired
ApplicationContext context;;
@Bean
public SchedulerFactoryBean quartzScheduler(){
SchedulerFactoryBean quartzScheduler = new SchedulerFactoryBean();
quartzScheduler.setOverwriteExistingJobs(true);
quartzScheduler.setSchedulerName("job-scheduler");
AutowiringSpringBeanJobFactory jobFactory = new AutowiringSpringBeanJobFactory();
jobFactory.setApplicationContext(context);
quartzScheduler.setJobFactory(jobFactory);
return quartzScheduler;
}
@Bean
@Scope(value = "prototype")
public JobDetailFactoryBean getJobBean(){
JobDetailFactoryBean bean = new JobDetailFactoryBean();
bean.setJobClass(DailyJob.class);
bean.setGroup("daily-group");
bean.setName("daily-name");
bean.setBeanName("daily-name");
bean.getJobDataMap().put("daily", "daily");
return bean;
}
@Bean
@Scope(value = "prototype")
// @Lazy(value = true)
public CronTriggerFactoryBean getCronTriggerBean(String cron){
CronTriggerFactoryBean bean = new CronTriggerFactoryBean();
bean.setCronExpression(cron);
bean.setJobDetail(getJobBean().getObject());
bean.setGroup("daily-group");
return bean;
}
}
在我的控制器中 class 我想按要求创建作业。我自动装配 SchedulerFactoryBean
以将石英触发器设置为 bean。
@Controller
public class JobController {
@Autowired
SchedulerFactoryBean quartzScheduler;
@Autowired
ApplicationContext context;;
@ResponseBody
@RequestMapping("/job/create/daily")
public String dailyJob(){
CronTriggerImpl cron = (CronTriggerImpl) context.getBean("getCronTriggerBean","30 * * ? * MON-FRI");
Trigger[] triggers = { cron };
quartzScheduler.setTriggers(triggers);
return "dailyJob";
}
}
一切正常,不会产生错误,Job
和 Trigger
设置为 quartzScheduler
(在调试模式下查看)。但工作永远不会 运行。我想念什么?
别忘了,有一个 class 实现了 Job
:
@Component
public class DailyJob implements Job{
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("Daily Job runs!");
}
}
尝试将“@EnableScheduling”添加到您的配置中
以下是对我有用的方法:
@Controller
public class JobController {
@Autowired
private Scheduler scheduler;
@Autowired
private ApplicationContext context;
@ResponseBody
@RequestMapping("/job/create/daily")
public String dailyJob() throws SchedulerException {
JobDetail jobDetail = context.getBean(JobDetail.class);
Trigger cronTrigger = context.getBean(Trigger.class, "30 * * ? * MON-FRI");
scheduler.scheduleJob(jobDetail, cronTrigger);
return "dailyJob";
}
}
您必须使用 Scheduler
而不是 SchedulerFactoryBean
,因为后者的目的是创建将在作业上运行的实际调度程序。
此外,如果您使用 scheduler.scheduleJob(cron)
它不会安排作业,因为它还没有在作业商店中,因此您需要使用它的详细信息创建作业并将 cron 表达式与其相关联.
我刚开始以动态方式创建 Quartz Scheduled Jobs。所以有一个 QuartzConfig class,我在其中创建了 SchedulerFactoryBean
、JobDetailFactoryBean
和 CronTriggerFactoryBean
。其中 Job 和 CronTrigger bean 是原型 bean。
@Configuration
public class QuartzConfig {
@Autowired
ApplicationContext context;;
@Bean
public SchedulerFactoryBean quartzScheduler(){
SchedulerFactoryBean quartzScheduler = new SchedulerFactoryBean();
quartzScheduler.setOverwriteExistingJobs(true);
quartzScheduler.setSchedulerName("job-scheduler");
AutowiringSpringBeanJobFactory jobFactory = new AutowiringSpringBeanJobFactory();
jobFactory.setApplicationContext(context);
quartzScheduler.setJobFactory(jobFactory);
return quartzScheduler;
}
@Bean
@Scope(value = "prototype")
public JobDetailFactoryBean getJobBean(){
JobDetailFactoryBean bean = new JobDetailFactoryBean();
bean.setJobClass(DailyJob.class);
bean.setGroup("daily-group");
bean.setName("daily-name");
bean.setBeanName("daily-name");
bean.getJobDataMap().put("daily", "daily");
return bean;
}
@Bean
@Scope(value = "prototype")
// @Lazy(value = true)
public CronTriggerFactoryBean getCronTriggerBean(String cron){
CronTriggerFactoryBean bean = new CronTriggerFactoryBean();
bean.setCronExpression(cron);
bean.setJobDetail(getJobBean().getObject());
bean.setGroup("daily-group");
return bean;
}
}
在我的控制器中 class 我想按要求创建作业。我自动装配 SchedulerFactoryBean
以将石英触发器设置为 bean。
@Controller
public class JobController {
@Autowired
SchedulerFactoryBean quartzScheduler;
@Autowired
ApplicationContext context;;
@ResponseBody
@RequestMapping("/job/create/daily")
public String dailyJob(){
CronTriggerImpl cron = (CronTriggerImpl) context.getBean("getCronTriggerBean","30 * * ? * MON-FRI");
Trigger[] triggers = { cron };
quartzScheduler.setTriggers(triggers);
return "dailyJob";
}
}
一切正常,不会产生错误,Job
和 Trigger
设置为 quartzScheduler
(在调试模式下查看)。但工作永远不会 运行。我想念什么?
别忘了,有一个 class 实现了 Job
:
@Component
public class DailyJob implements Job{
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("Daily Job runs!");
}
}
尝试将“@EnableScheduling”添加到您的配置中
以下是对我有用的方法:
@Controller
public class JobController {
@Autowired
private Scheduler scheduler;
@Autowired
private ApplicationContext context;
@ResponseBody
@RequestMapping("/job/create/daily")
public String dailyJob() throws SchedulerException {
JobDetail jobDetail = context.getBean(JobDetail.class);
Trigger cronTrigger = context.getBean(Trigger.class, "30 * * ? * MON-FRI");
scheduler.scheduleJob(jobDetail, cronTrigger);
return "dailyJob";
}
}
您必须使用 Scheduler
而不是 SchedulerFactoryBean
,因为后者的目的是创建将在作业上运行的实际调度程序。
此外,如果您使用 scheduler.scheduleJob(cron)
它不会安排作业,因为它还没有在作业商店中,因此您需要使用它的详细信息创建作业并将 cron 表达式与其相关联.