【问题标题】:Query quartz for existing triggers using criteria使用条件查询现有触发器的石英
【发布时间】:2013-08-07 21:29:53
【问题描述】:

我正在使用石英来安排工作。作业在“默认”组中创建,相关信息在使用 schedule 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 来做同样的事情。

编辑:从石英 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 %

【问题讨论】:

    标签: java api quartz-scheduler scheduler


    【解决方案1】:

    你可以在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());
    }    
    

    【讨论】:

      【解决方案2】:

      Quartz 以序列化映射 (JobDataMap) 格式存储 JobDetails。除非deserialization,否则很难知道地图的实际内容是什么。

      在您的情况下,我认为没有直接的方法,您可能需要找到解决方法,将作业数据映射值存储到单独的表中,该表将与 Trigger id 关联,但我不确定如何这个解决方案是可销售的。

      【讨论】:

      • 是的,我想知道是否有直接的 API。管理应用程序中的数据似乎不是一个好主意。谢谢。
      猜你喜欢
      • 2020-12-15
      • 1970-01-01
      • 2013-01-29
      • 1970-01-01
      • 2014-01-26
      • 2011-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多