首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >弹簧-启动石英作业不运行

弹簧-启动石英作业不运行
EN

Stack Overflow用户
提问于 2017-06-26 11:47:27
回答 2查看 6.2K关注 0票数 0

我刚开始用一种动态的方式创建Quartz计划的乔布斯。因此,有一个QuartzConfig类,其中我创建了一个SchedulerFactoryBeanJobDetailFactoryBeanCronTriggerFactoryBean。其中作业和CronTrigger bean是原型。

代码语言:javascript
复制
@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设置石英触发器到豆。

代码语言:javascript
复制
@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的类

代码语言:javascript
复制
@Component
public class DailyJob implements Job{

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

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-06-27 07:59:03

以下是对我起作用的东西:

代码语言:javascript
复制
@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表达式与其关联。

票数 1
EN

Stack Overflow用户

发布于 2017-06-26 12:25:43

尝试将"@EnableScheduling“添加到配置中

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44759026

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档