【问题标题】:Spring boot quartz 2.2.1 compilation errorSpring Boot Quartz 2.2.1 编译报错
【发布时间】:2016-07-05 06:44:16
【问题描述】:

这是我用于将新的 cron 作业保存到 postgresql 数据库的代码。但它显示了一些编译时异常。我最初使用 spring boot web 应用程序将石英 1.8.6 迁移到 2.2.1。见附件.

private static final String JOBNAME = "sampleJobRunner";
    private static final String JOB_GROUPNAME = "sampleGroup";

    public void saveScheduledTime(String name) throws SchedulerException, ParseException {
        Scheduler scheduler;
        CronTrigger trigger;
        String cronExp = null;
        scheduler = this.quartzScheduler.getObject();
        trigger = (CronTrigger) scheduler.getTrigger(name, JOB_GROUPNAME);
        if (scheduler != null) {
                cronExp = "0 0 12 ? 1 MON#1 *";
            if (trigger != null) {
                rescheduleJob(scheduler, trigger.getName(), cronExp);
            } else {
                createNewCronTrigger(scheduler, cronExp, name);
            }
        }
    }
    private void rescheduleJob(Scheduler scheduler, String triggerName, String cronExp)
            throws SchedulerException, ParseException {
        CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerName, JOB_GROUPNAME);
        trigger.setCronExpression(cronExp);
        scheduler.rescheduleJob(triggerName, JOB_GROUPNAME, trigger);
    }

    private void createNewCronTrigger(Scheduler scheduler, String cronExp, String sentType)
            throws SchedulerException, ParseException {
        CronTrigger trigger = new CronTrigger(sentType, JOB_GROUPNAME, JOBNAME, JOB_GROUPNAME, cronExp);
        scheduler.scheduleJob(trigger);
        scheduler.start();
    }

Spring boot 石英配置

@Configuration
@ConditionalOnProperty(name = "quartz.enabled")
public class SchedulerConfig {
    @Bean
    public JobFactory jobFactory(ApplicationContext applicationContext) {
        AutowiringSpringBeanJobFactory jobFactory = new AutowiringSpringBeanJobFactory();
        jobFactory.setApplicationContext(applicationContext);
        return jobFactory;
    }
    @Bean
    public SchedulerFactoryBean schedulerFactoryBean(DataSource dataSource, JobFactory jobFactory,
            @Qualifier("sampleJobTrigger") Trigger sampleJobTrigger) throws IOException {
        SchedulerFactoryBean factory = new SchedulerFactoryBean();
        // this allows to update triggers in DB when updating settings in config
        // file:
        factory.setOverwriteExistingJobs(true);
        factory.setDataSource(dataSource);
        factory.setJobFactory(jobFactory);
        factory.setQuartzProperties(quartzProperties());
        // factory.setTriggers(sampleJobTrigger);
        return factory;
    }

    @Bean
    public Properties quartzProperties() throws IOException {
        PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean();
        propertiesFactoryBean.setLocation(new ClassPathResource("/quartz.properties"));
        propertiesFactoryBean.afterPropertiesSet();
        return propertiesFactoryBean.getObject();
    }
    @Bean
    public JobDetailFactoryBean sampleJobDetail() {
        return createJobDetail(SampleJob.class);
    }
    @Bean(name = "sampleJobTrigger")
    public SimpleTriggerFactoryBean sampleJobTrigger(@Qualifier("sampleJobDetail") JobDetail jobDetail,
            @Value("${samplejob.frequency}") long frequency) {
        return createTrigger(jobDetail, frequency);
    }
    private static JobDetailFactoryBean createJobDetail(Class jobClass) {
        JobDetailFactoryBean factoryBean = new JobDetailFactoryBean();
        factoryBean.setJobClass(jobClass);
        // job has to be durable to be stored in DB:
        factoryBean.setDurability(true);
        return factoryBean;
    }
    private static SimpleTriggerFactoryBean createTrigger(JobDetail jobDetail, long pollFrequencyMs) {
        SimpleTriggerFactoryBean factoryBean = new SimpleTriggerFactoryBean();
        factoryBean.setJobDetail(jobDetail);
        factoryBean.setStartDelay(0L);
        factoryBean.setRepeatInterval(pollFrequencyMs);
        factoryBean.setRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY);
        // in case of misfire, ignore all missed triggers and continue :
        factoryBean.setMisfireInstruction(SimpleTrigger.MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_REMAINING_COUNT);
        return factoryBean;
    }
}

【问题讨论】:

  • 您没有包含任何导入语句,因此我们无法判断您指的是什么类型。实际的编译错误也会很有用。

标签: spring postgresql spring-boot quartz-scheduler


【解决方案1】:

修复代码中的编译错误:

  • 使用 scheduler.getTrigger(new TriggerKey(name, JOB_GROUPNAME));
  • 使用 scheduler.rescheduleJob(new TriggerKey(name, JOB_GROUPNAME), trigger);
  • 将 CronTrigger 转换为具有 setCronExpression() 方法的 CronTriggerImpl

在 github 上查看我的 Spring Boot + Quartz 示例项目:https://github.com/davidkiss/spring-boot-quartz-demo。我使用新的 createCronTrigger 辅助方法更新了 SchedulerConfig 类,该方法允许在 Spring Boot 中创建 cron 触发器:

  private static CronTriggerFactoryBean createCronTrigger(JobDetail jobDetail, String cronExpression) {
    CronTriggerFactoryBean factoryBean = new CronTriggerFactoryBean();
    factoryBean.setJobDetail(jobDetail);
    factoryBean.setCronExpression(cronExpression);
    factoryBean.setMisfireInstruction(SimpleTrigger.MISFIRE_INSTRUCTION_FIRE_NOW);
    return factoryBean;
  }

如果您在项目中使用 Spring Boot,我相信使用 SchedulerConfig 类是在 Spring Boot 中配置石英作业然后调用 saveScheduledTime() 方法的一种更简洁的方法。

为了创建任何 cron 触发器,我将在 SchedulerConfig 类中添加其他方法来创建类似于 sampleJobTrigger 的适当触发器 bean。

【讨论】:

  • 感谢您的快速响应...根据您在 github 上的示例,我需要调用 createCronTrigger(JobDetail jobDetail, String cronExpression)。但是我应该通过什么工作细节。下面是我的 JobDetails JobDetail job = JobBuilder.newJob(SampleJob.class) .withIdentity(name, "group1").build();
  • 请添加您的 github 项目并保存新的 cron 触发器
  • 查看 SchedulerConfig.sampleJobDetail() 方法作为如何创建 JobDetail bean 的示例,但您也可以在评论中使用 JobBuilder 代码
  • 根据您的示例,我应该使用什么组名。
  • JobDetailFactoryBean jobDetailFactoryBean = SchedulerConfig.createJobDetail(SampleJob.class,name); JobDetail jobDetail = jobDetailFactoryBean.getObject(); CronTriggerFactoryBean cronTriggerFactoryBean = SchedulerConfig.createCronTrigger(jobDetail, "0/5 * * * * ?");触发触发器 = cronTriggerFactoryBean.getObject();调度器 scheduler = new StdSchedulerFactory().getScheduler();调度程序.start(); scheduler.scheduleJob(jobDetail, trigger);我使用此代码来安排作业。但它显示作业详细信息不能为空异常。
【解决方案2】:

这纯粹是从 Quartz 1.8.6 迁移到 2.2.1 的结果。 Quartz 对 2.x 版本进行了一些代码更改。您需要在您的应用程序中进行更改以尊重这一点。看看这个:http://www.quartz-scheduler.org/documentation/quartz-2.x/migration-guide.html

【讨论】:

  • 链接失效
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-03
  • 2020-03-08
  • 2016-10-10
  • 1970-01-01
  • 1970-01-01
  • 2020-03-22
  • 1970-01-01
相关资源
最近更新 更多