2

在我的项目中,我们是 Quartz 的新手用户,正在编写我们的第一个 Quartz 任务。我们的任务正在运行,但显然我们想了解如何管理它们。我们在 Spring 中配置它们,如下所示:

<bean name="enoteExpirationTask"    class="org.springframework.scheduling.quartz.JobDetailBean">
    <property name="jobClass" value="gov.usdoj.afms.enote.job.DailyExpirationJob" />
    <property name="jobDataAsMap">
        <map>
            <entry key="messageService" value-ref="enoteMessageService" />
            <entry key="logicalDeleteAge" value="${expiryProcess.logical.age}" />
            <entry key="physicalDeleteAge" value="${expiryProcess.physical.age}" />
        </map>
    </property>
</bean>
<bean id="cronEnoteExpirationTaskTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
    <property name="jobDetail" ref="enoteExpirationTask" />
    <property name="cronExpression" value="0 0 7 * * ?" />
</bean>

问题 1:我可以让 Quartz 重新读取这个配置,这样如果我在运行时改变它,它就会改变它的调度吗?这将是最简单的解决方案,但我们没有看到任何内容。我希望我们错过了什么。

问题 2:如果没有,我知道应该有第三方工具来执行此操作,Teracotta 就是其中之一。是否有任何开源或免费软件实用程序可以让您非常简单地更改时间表?

问题 3:如果不是,那么编写一个小的 Java 实用程序来完成它涉及什么?值得写一个吗?或者 Teracotta 是否有足够的附加值让您推荐购买它?如果是这样,我可以向管理层出售哪些不同的功能?

4

2 回答 2

6

我的实现(Spring 3.0.6,Quartz 2.2.1):

public interface SchedulerService {

    void register( Class<? extends Job> jobClass, String cronExpression );

    void reschedule( Class<? extends Job> jobClass, String cronExpression );

}

@Service
public class SchedulerServiceImpl implements SchedulerService {

    private Scheduler scheduler;

    @PostConstruct
    void init() {
        try {
            scheduler = StdSchedulerFactory.getDefaultScheduler();
            scheduler.start();
        } catch ( Exception e ) {
            // handle exception
        }
    }

    @PreDestroy
    void destroy() {
        try {
            scheduler.shutdown();
        } catch ( Exception e ) {
            // handle exception
        }
    }

    @Override
    public void register( Class<? extends Job> jobClass, String cronExpression ) {
        try {
            String name = jobClass.getSimpleName();
            CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule( cronExpression );

            JobDetail jobDetail = JobBuilder.newJob( jobClass ).withIdentity( name ).build();
            CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity( name ).withSchedule( cronScheduleBuilder ).build();

            scheduler.scheduleJob( jobDetail, cronTrigger );
        } catch ( Exception e ) {
            // handle exception
        }
    }

    @Override
    public void reschedule( Class<? extends Job> jobClass, String cronExpression ) {
        try {
            String name = jobClass.getSimpleName();
            CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule( cronExpression );

            CronTrigger newCronTrigger = TriggerBuilder.newTrigger().withIdentity( name ).withSchedule( cronScheduleBuilder ).build();

            scheduler.rescheduleJob( TriggerKey.triggerKey( name ), newCronTrigger );
        } catch ( Exception e ) {
            // handle exception
        }
    }

}

使用示例:

@Service
public class MyServiceImpl implements MyService {

    @Autowired
    SchedulerService schedulerService;

    @PostConstruct
    void init() {
        schedulerService.register( MyJob.class, "0 10 * * * ?" );
    }

    @Override
    public void reschedule( String cronExpression ) {
        schedulerService.reschedule( MyJob.class, cronExpression );
    }

    @DisallowConcurrentExecution
    public static class MyJob implements Job {

        @Override
        public void execute( JobExecutionContext context ) throws JobExecutionException {
            // ...
        }

    }

}
于 2014-06-17T13:32:19.537 回答
0

当您通过 Spring 使用 Quartz 时,这可能更像是一个 Spring 问题而不是 Quartz 问题,而且我对 Spring 的了解还不够,无法帮助您。

但是,如果您愿意在没有 Spring 包装器的情况下使用 Quartz,Quartz 提供了您需要在 XML 文件中指定计划的所有内容,它可以选择以可配置的间隔扫描更新。这个插件被调用org.quartz.plugins.xml.XMLSchedulingDataProcessorPlugin,它的基本配置在文档中解释。Quartz 发行版包含几个示例,示例 10 展示了如何使用 XMLSchedulingDataProcessorPlugin 及其随附的作业配置文件,默认设置下每 120 秒重新扫描一次。玩那个演示并研究它的源代码应该足以让您了解 Quartz 以开始使用。

于 2013-05-15T17:17:29.513 回答