Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用条件查询现有触发器_Java_Api_Quartz Scheduler_Scheduler - Fatal编程技术网

Java 使用条件查询现有触发器

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

我用石英来安排工作。作业在“默认”组中创建,相关信息在使用ScheduleAPI时以jobdetail映射的形式作为有效负载传递

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());
}