首页 文章

Spring-Boot Quartz Job未运行

提问于
浏览
0

我刚开始以动态方式创建Quartz Scheduled Jobs . 所以有一个QuartzConfig类,我在其中创建 SchedulerFactoryBeanJobDetailFactoryBeanCronTriggerFactoryBean . 其中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;
    }
}

在我的Controller类中,我想按请求创建作业 . 我自动将 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";
    }
}

一切正常工作而不会产生错误, JobTrigger 设置为 quartzScheduler (在调试模式下查看) . 但约伯从来没有跑过 . 我错过了什么?

不要忘记,有一个实现 Job 的类:

@Component
public class DailyJob implements Job{

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        System.out.println("Daily Job runs!");
    }
}

2 回答

  • 1

    这对我有用:

    @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) ,那么您需要'll need to create a job using it'的详细信息并将cron表达式与它关联起来 .

  • 0

    尝试在您的配置中添加“@EnableScheduling”

相关问题