Запросите кварц для существующих триггеров, используя критерии

Я использую кварц для планирования работы. Задания создаются в группе «по умолчанию», и соответствующая информация передается в качестве полезной нагрузки в виде карты сведений о задании при использовании 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% по своей природе.


person nutsiepully    schedule 14.06.2012    source источник


Ответы (2)


Вы можете перечислить все свои задачи в кварце и собрать необходимые

попробуйте этот код (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());
}    
person Dmitry Sh    schedule 14.06.2012

Quartz хранит JobDetails в формате сериализованной карты (JobDataMap). Если только deserialization трудно узнать, каково фактическое содержимое карты.

В вашем случае, я думаю, прямого пути нет. Возможно, вам придется найти обходной путь, например, сохранение значений карты данных задания в отдельной таблице, с которой будет связано Trigger id, но я не уверен, насколько это решение будет продаваться .

person RP-    schedule 14.06.2012
comment
да, я хотел узнать, есть ли прямой API. Управление данными в приложении не кажется хорошей идеей. Благодарю. - person nutsiepully; 14.06.2012