在我的项目中,我们是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是否有足够的增值值,你会建议买它?如果是这样,我可以向管理层出售哪些不同的制作功能?
答案 0 :(得分:5)
我的实现(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 {
// ...
}
}
}
答案 1 :(得分:0)
当你在Spring中使用Quartz时,可能更像是一个Spring问题而不是Quartz问题,而且我对Spring的帮助还不够。
但是,如果您愿意在没有Spring包装的情况下使用Quartz,那么Quartz拥有您需要在XML文件中指定计划的所有内容,它可以选择以可配置的间隔扫描更新。此插件名为org.quartz.plugins.xml.XMLSchedulingDataProcessorPlugin
,其基本配置解释为in the documentation。 Quartz发行版包含几个示例,示例10显示了如何使用XMLSchedulingDataProcessorPlugin及其附带的作业配置文件,该文件在默认设置中将每120秒重新扫描一次。使用该演示并研究其源代码应该对Quartz有足够的了解,以便开始使用。