2012-06-14 36 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()); 
}