java - Spring-Boot Quartz 作业未运行

标签 java spring spring-boot cron quartz-scheduler

我刚刚开始以动态方式创建 Quartz 计划作业。因此,有一个 QuartzConfig 类,我在其中创建了 SchedulerFactoryBeanJobDetailFactoryBeanCronTriggerFactoryBean。其中Job和CronTrigger bean是原型(prototype)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 类中,我想根据请求创建作业。我 Autowiring SchedulerFactoryBean 以将 quartz 触发器设置为 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(在 Debug模式下查看)。但作业从未运行。我想念什么?

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

@Component
public class DailyJob implements Job{

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

最佳答案

这是对我有用的:

@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 表达式与其关联起来。

关于java - Spring-Boot Quartz 作业未运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44759026/

相关文章:

java - ATM限额钞票给钱算法

java - org.springframework.beans.factory.UnsatisfiedDependencyException : Error creating bean. ..期望单个匹配的bean,但发现12

用于多个登录页面的Spring 3.x配置

java - zip4j 不提取具有大扩展名的文件

java - 原始数据解析

java - 如何将 CORS header 设置为内部服务器错误响应?

javascript - 为什么提交到Spring Controller 后java无法识别html文本?

spring - 如何将配置类型(SpringBootApplicationConfiguration)添加到Intellij以便识别?

java - 如何在 spring AOP 类中使用 HystrixCommand

java - Zuul不转发请求到其他微服务