2013-05-15 41 views
1

我們是新手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:我可以這樣說,如果我在運行時改變它,它改變其日程石英重新讀取這個配置?這將是最簡單的解決方案,但我們沒有看到任何東西。我希望我們錯過了一些東西。

問題2:如果不是,我知道應該有第三方工具來做到這一點,Teracotta是一個。是否有任何開源或免費軟件工具可以讓您非常簡單地更改計劃?

問題3:如果不是,寫一點Java實用程序來做什麼呢?寫它是值得的嗎?或者Teracotta有足夠的附加價值,你會推薦購買它嗎?如果是這樣,我可以向管理層出售的功能有什麼不同?

回答

0

由於您通過Spring使用Quartz,這可能比Quartz問題更多的是Spring問題,而且我對Spring的幫助還不夠。然而,如果你願意在沒有Spring包裝的情況下使用Quartz,Quartz擁有一切你需要在一個XML文件中指定時間表,它可以選擇性地以可配置的間隔掃描更新。該插件被稱爲org.quartz.plugins.xml.XMLSchedulingDataProcessorPlugin,其基本配置被解釋爲in the documentation。 Quartz發行版包含幾個示例,示例10顯示瞭如何使用XMLSchedulingDataProcessorPlugin及其隨附的作業配置文件,該文件在默認設置中將每120秒重新掃描一次。使用該演示並研究其源代碼應該足夠了解Quartz的入門知識。

5

我實現(春3.0.6,2.2.1石英):

@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 { 
      // ... 
     } 

    } 

} 

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 
     } 
    } 

} 

使用示例