我正在使用quartz来安排作业。使用计划 API 时,作业是在“默认”组中创建的,相关信息以作业详细信息映射的形式作为有效负载传递。
Trigger trigger = new Trigger(...);
JobDetail jobDetail = new JobDetail(...);
jobDetail.put(...);
scheduler.schedule(trigger, jobDetail);
我希望 API 能够根据发送的有效负载查询数据库中的触发器。例如,我将“externalId”作为 jobDetail 的一部分。
我想做类似的事情
scheduler.getTriggers(new Criteria("externalId", externalId));
而不是获取内存中的所有触发器然后对其进行迭代。我在网上进行了一些搜索,但找不到可以执行相同操作的 API。
编辑:从quartz 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.
但这些不适用于quartz 1.8。仍然存在一个限制,即触发器搜索需要准确,并且本质上不能为 LIKE %
最佳答案
您可以在quartz中列出所有任务并收集所需的
试试这个代码(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());
}
关于java - 使用条件查询现有触发器的quartz,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11028389/