2012-08-31 82 views
4

我用我的Web應用程序(Servlet的Web應用程序)石英以下是quartz.property文件的快照和quartz.job.xml需要設置石英cron表達式動態

quartz.property

#=================================================== 
# Configure the Job Initialization Plugin 
#=================================================== 

org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.XMLSchedulingDataProcessorPlugin 
org.quartz.plugin.jobInitializer.fileNames = jobs.xml 
org.quartz.plugin.jobInitializer.failOnFileNotFound = true 
org.quartz.plugin.jobInitializer.scanInterval = 10 
org.quartz.plugin.jobInitializer.wrapInUserTransaction = false 


<?xml version='1.0' encoding='utf-8'?> 
<job-scheduling-data xmlns="http://www.quartz-scheduler.org/xml/JobSchedulingData" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.quartz-scheduler.org/xml/JobSchedulingData http://www.quartz-scheduler.org/xml/job_scheduling_data_1_8.xsd" 
    version="1.8"> 

    <schedule> 
     <job> 
      <name>my-very-clever-job</name> 
      <group>MYJOB_GROUP</group> 

      <description>The job description</description> 
      <job-class>com.acme.scheduler.job.ReportJob</job-class> 
     </job> 

     <trigger> 
      <cron> 
       <name>my-trigger</name> 
       <group>MYTRIGGER_GROUP</group> 
       <job-name>my-very-clever-job</job-name> 

       <job-group>MYJOB_GROUP</job-group> 
       <!-- trigger every night at 4:30 am --> 
       <cron-expression>0 30 4 * * ?</cron-expression> 

      </cron> 
     </trigger> 
    </schedule> 
</job-scheduling-data> 

每一件事都按這個順序正常工作。我需要允許用戶以他們想要的方式更改時間(cron表達式)。我的問題是如何動態設置cron表達式。

回答

5
CronTrigger cronTrigger = (CronTrigger) stdScheduler 
       .getTrigger(triggerName,triggerGroupName); 
CronTrigger newTriggerIns = new CronTrigger(); 
newTriggerIns.setJobName(cronTrigger.getJobName()); 
newTriggerIns.setName(triggerName); 
newTriggerIns.setCronExpression(newCronExpression); 
stdScheduler.rescheduleJob(triggerName,triggerGroupName,newTriggerIns); 

在上面,取現有的觸發器實例。 創建一個新的觸發器實例並設置cron表達式。

然後重新安排新的實例。

+0

原理這裏聽上去不錯,但執行是不可能與當前的春天實現。 CronTrigger是一個抽象類,所以你必須做下面的@atripathi註釋。 – Ryaminal

+0

我已經發布了上面的代碼,當它爲我工作,現在它正在用來重新安排一個觸發器。 –

+0

你在哪裏可以插入此代碼?在工作本身?我試圖做同樣的事情,但不知道如何創建de stdScheduler。謝謝 –

0

使用石英api。以編程方式使用此觸發器實例,將其轉換爲CronTrigger實例並使用它的setCronExpression動態地放置表達式。

+0

你能爲我提供一個樣本,可以 – Sam

4

像這樣創建一個新的觸發器不起作用。

CronTrigger cronTrigger = (CronTrigger) stdScheduler.getTrigger(triggerName,triggerGroupName); 
CronTrigger newTriggerIns = new CronTrigger(); 
newTriggerIns.setJobName(cronTrigger.getJobName()); 
newTriggerIns.setName(triggerName); 
newTriggerIns.setCronExpression(newCronExpression); 
stdScheduler.rescheduleJob(triggerName,triggerGroupName,newTriggerIns); //doesn't work 

你只需要編輯原始觸發這樣的:

CronTrigger cronTrigger = (CronTrigger) stdScheduler.getTrigger(triggerName,triggerGroupName); 
cronTrigger.setCronExpression(newCronExpression); 
stdScheduler.rescheduleJob(triggerName,triggerGroupName,cronTrigger); 
+0

你在哪裏插入此代碼?在工作本身? 我試圖做同樣的事情,但不知道如何創建de stdScheduler。 謝謝 –

+0

不,不在工作本身。把這段代碼放在工作之外,你需要設置CRON表達式。 – atripathi