Java 使用条件查询现有触发器
我用石英来安排工作。作业在“默认”组中创建,相关信息在使用ScheduleAPI时以jobdetail映射的形式作为有效负载传递Java 使用条件查询现有触发器,java,api,quartz-scheduler,scheduler,Java,Api,Quartz Scheduler,Scheduler,我用石英来安排工作。作业在“默认”组中创建,相关信息在使用ScheduleAPI时以jobdetail映射的形式作为有效负载传递 Trigger trigger = new Trigger(...); JobDetail jobDetail = new JobDetail(...); jobDetail.put(...); scheduler.schedule(trigger, jobDetail); 我希望API能够根据发送的负载查询数据库中的触发器。例如,我将“externalId”作为j
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.
但石英1.8不提供这些。一个限制仍然是触发器搜索需要精确,并且本质上不能像%Quartz以序列化映射(
JobDataMap
)格式存储JobDetails
)。除非反序列化,否则很难知道映射的实际内容
在您的情况下,我认为没有直接的方法,您可能需要找到一种解决方法,例如,将作业数据映射值存储到单独的表中,该表将具有与其关联的
触发器id
,但我不确定此解决方案的销售情况。您可以在quartz中列出所有任务并收集所需的数据
请尝试以下代码(jsp):
SchedulerFactory sf=new StdSchedulerFactory(新文件(getServletContext().getRealPath(“/”,“WEB-INF/quartz.properties”).getAbsolutePath());
调度器调度器=sf.getScheduler();
试一试{
List jobList=scheduler.getCurrentlyExecutingJobs();
out.print(“当前任务:“+jobList.size()+”);
for(JobExecutionContext jec:jobList){
打印输出(“
”);
JobDetail JobDetail=jec.getJobDetail();
Trigger=jec.getTrigger();
TriggerState=scheduler.getTriggerState(trigger.getKey());
%>
类别:
描述:
下次开火时间:
先前:
是的,我想知道是否有直接API。管理应用程序中的数据似乎不是一个好主意。谢谢。
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());
}