2012-06-14 33 views
0

我使用石英來安排工作。作業是在「默認」組中創建的,並且在使用schedule api時,相關信息作爲有效載荷以jobdetail地圖的形式傳遞。使用條件爲現有觸發器查詢石英

Trigger trigger = new Trigger(...); 
JobDetail jobDetail = new JobDetail(...); 
jobDetail.put(...); 
scheduler.schedule(trigger, jobDetail); 

我想一個API,能夠查詢觸發器中,根據在發送有效載荷的數據庫。例如,我有「外部ID」爲JobDetail中的一部分。

我要像做

scheduler.getTriggers(new Criteria("externalId", externalId)); 

,而不是獲取內存中的所有觸發器,然後遍歷它。我在網上搜索了一下,但無法找到一個API來做同樣的事情。

編輯:石英,2.1.5中,有幾個新的API

scheduler.getTrigger(triggerKey(jobId, jobGroupName)); // which can fetch the exact trigger given the triggerKey 
scheduler.getTriggerKeys(GroupMatcher.triggerGroupContains(JOB_GROUP_NAME)); //this searches all the triggers for a group. 

這些不適用於石英1.8雖然。一個限制仍然是觸發器搜索需要精確並且不能在自然中LIKE%

回答

0

石英商店JobDetails在一個序列化的地圖(JobDataMap)格式。除非deserialization很難知道地圖的實際內容是什麼。

在你的情況下,我認爲沒有直接的方法,你可能需要找到一個類似的工作,將作業數據映射值存儲到單獨的表中,該表將與Trigger id相關聯,但我不確定如何銷售這個解決方案將是。

+0

是的,我想知道是否有直接的API。管理應用程序中的數據似乎不是一個好主意。謝謝。 – nutsiepully

1

你可以列出所有你的任務在石英和收集所需

試試這個代碼(JSP):

SchedulerFactory sf = new StdSchedulerFactory(new File(getServletContext().getRealPath("/"), "WEB-INF/quartz.properties").getAbsolutePath()); 
Scheduler scheduler = sf.getScheduler(); 

try{ 
    List<JobExecutionContext> jobList = scheduler.getCurrentlyExecutingJobs(); 

    out.print("<h3>Current tasks: "+jobList.size()+"</h3>"); 
    for(JobExecutionContext jec : jobList){ 
     out.print("<hr>"); 
     JobDetail jobDetail = jec.getJobDetail(); 
     Trigger trigger = jec.getTrigger(); 
     TriggerState state = scheduler.getTriggerState(trigger.getKey()); 
     %> 
     <table style="width: 400px; background-color: #ffffff;"> 
      <tr style="height: 23px;"> 
       <td style="width: 190px;"> 
        class: 
       </td> 
       <td style="width: 210px;"> 
        <b><%=jec.getJobInstance().toString()%></b> 
       </td> 
      </tr>  
      <tr style="height: 23px;"> 
       <td> 
        descr: 
       </td> 
       <td> 
        <i><%=jobDetail.getDescription()%></i> 
       </td> 
      </tr>      
      <tr style="height: 23px;"> 
       <td> 
        next fire time: 
       </td> 
       <td> 
        <%=new Timestamp(trigger.getFireTimeAfter(new Timestamp(System.currentTimeMillis())).getTime())%> 
       </td> 
      </tr> 
      <tr style="height: 23px;"> 
       <td> 
        prior: 
       </td> 
       <td> 
        <%=state.toString()%> 
       </td> 
      </tr>     
     </table> 
     <% 
    } 
}catch(Exception ex){ 
    out.print(ex.getMessage()); 
} 

out.print("<hr>"); 

// getting all tasks 
try{ 
    List<String> jobGroups = scheduler.getJobGroupNames(); 

    out.print("<h3>Triggers: "+jobGroups.size()+"</h3>"); 
    for (String jName : jobGroups){ 
     GroupMatcher<JobKey> matcher = GroupMatcher.groupEquals(jName); 
     Set keys = scheduler.getJobKeys(matcher); 
     Iterator iter = keys.iterator(); 
     while (iter.hasNext()){ 
      JobKey jk = (JobKey)iter.next(); 
      JobDetail jobDetail = scheduler.getJobDetail(jk); 
      // JobDataMap jobDataMap = jobDetail.getJobDataMap(); 

      List<? extends Trigger> triggers = scheduler.getTriggersOfJob(jk); 
      for(Trigger t : triggers){ 
       out.print("<hr>"); 
       TriggerState state = scheduler.getTriggerState(t.getKey()); 
       %> 

       <table style="width: 400px; background-color: #ffffff;"> 
        <tr style="height: 23px;"> 
         <td style="width: 190px;"> 
          group/class: 
         </td> 
         <td style="width: 210px;"> 
          <b><%=t.getJobKey().toString()%></b> 
         </td> 
        </tr> 
        <tr style="height: 23px;"> 
         <td style="width: 190px;"> 
          descr: 
         </td> 
         <td style="width: 210px;"> 
          <i><%=jobDetail.getDescription()%></i> 
         </td> 
        </tr>       
        <tr style="height: 23px;"> 
         <td> 
          curr time: 
         </td> 
         <td> 
          <%=new Timestamp(System.currentTimeMillis())%> 
         </td> 
        </tr>       
        <tr style="height: 23px;"> 
         <td> 
          next fire time: 
         </td> 
         <td> 
          <%=new Timestamp(t.getFireTimeAfter(new Timestamp(System.currentTimeMillis())).getTime())%> 
         </td> 
        </tr>       
        <tr style="height: 23px;"> 
         <td> 
          prior: 
         </td> 
         <td> 
          <%=state.toString()%> 
         </td> 
        </tr>       
       </table> 

       <% 
      } 
     } 
    } 
    out.print("<hr>"); 
}catch (SchedulerException ex){ 
    out.print(ex.getMessage()); 
}