【问题标题】:Spring Autowire Quartz SchedulerSpring Autowire Quartz 调度器
【发布时间】:2014-06-06 21:41:58
【问题描述】:

我的网络服务器上运行了一个石英作业,通过 Spring 配置如下:

@Configuration
public class StatisticsJobConfig {

    @Bean
    public JobDetailBean jobDetailBean() {
        JobDetailBean jobDetailBean = new JobDetailBean();
        jobDetailBean.setJobClass(StatisticsJob.class);
        jobDetailBean.setBeanName("statisticsJobBean");
        jobDetailBean.setName("statisticsJob");
        jobDetailBean.setGroup("default");
        return jobDetailBean;
    }

    @Bean
    public CronTriggerBean cronTriggerBean(@Qualifier("jobDetailBean") JobDetailBean jobDetailBean) throws ParseException {
        CronTriggerBean cronTriggerBean = new CronTriggerBean();

        cronTriggerBean.setBeanName("cronTriggerBean");
        cronTriggerBean.setJobDetail(jobDetailBean);
        cronTriggerBean.setCronExpression("0/5 * * * * ?");

        return cronTriggerBean;

    }

    @Bean
    public SchedulerFactoryBean schedulerFactoryBean(@Qualifier("cronTriggerBean") CronTriggerBean cronTriggerBean
            , @Qualifier ApplicationContext applicationContext) {
        SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
        schedulerFactoryBean.setExposeSchedulerInRepository(true);

        schedulerFactoryBean.setTriggers(cronTriggerBean);

        AutowiringSpringBeanJobFactory jobFactory = new AutowiringSpringBeanJobFactory();
        jobFactory.setApplicationContext(applicationContext);
        schedulerFactoryBean.setJobFactory(jobFactory);

        return schedulerFactoryBean;
    }

    public void setCronExpression(String cronExpression) {
        this.cronExpression = cronExpression;
    }


}

(StatisticsJob 类扩展了 QuartzJobBean 并实现了 executeInternal 方法)。

该作业在服务器启动后按照 cron 表达式成功执行。但是,我还希望能够随意安排此作业,例如当用户按下按钮时。为了做到这一点,我在控制器中创建了一个 restful 方法,我想在该控制器上注入石英调度程序,如下所示:

@RequestMapping(value = "/triggerJob", method = RequestMethod.GET)
    public ResponseEntity<String> triggerJob(@Qualifier StdSchedulerFactory schedulerFactory) {

        try {
            Scheduler scheduler = schedulerFactory.getScheduler();

            JobDetail jobDetail = new JobDetail("statisticsJob",StatisticsJob.class);


            scheduler.scheduleJob(jobDetail,TriggerUtils.makeImmediateTrigger("new",0, 0));


        } catch (SchedulerException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return new ResponseEntity<>(HttpStatus.OK);

    }

但是,即使在执行上述代码之后,作业也不会被安排。我做错了什么?我可以尝试其他方法吗?

【问题讨论】:

    标签: java spring


    【解决方案1】:

    解决方案是在我的控制器中自动装配 SchedulerFactoryBean 本身,并在可通过它访问的调度程序上调用 rescheduleJob 方法:

    @Autowired
    private SchedulerFactoryBean schedulerFactory;
    
    @RequestMapping(value = "/triggerJob", method = RequestMethod.GET)
    public ResponseEntity<String> triggerJob() {
        try {
            schedulerFactory.getScheduler().triggerJob("statisticsJob", "default");
        } catch (SchedulerException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    
        return new ResponseEntity<>(HttpStatus.OK);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-24
      • 1970-01-01
      • 2017-10-16
      • 1970-01-01
      • 1970-01-01
      • 2022-01-13
      • 2013-03-17
      相关资源
      最近更新 更多