4

我在 Spring 项目中创建了两个工作,它们在两个不同的时间运行,彼此独立。

public class JobA extends QuartzJobBean
{
    @Override
    protected void executeInternal(JobExecutionContext arg0)throws JobExecutionException 
    {
      // my actual work
    }
}

public class JobB extends QuartzJobBean
{
    @Override
    protected void executeInternal(JobExecutionContext arg0)throws JobExecutionException 
    {
      // my actual work
    }
}

两者在给定时间都运行良好,但我需要提供一些监视器功能,通过它我们可以检查作业是否正在运行。
我遇到了JobListener并且也看到了其他资源,但在实施时感到困惑。我不知道如何在Spring Controller中使用此侦听器,以便我可以在我的 jsp 中监视这两项工作。

更新:我正在使用 Quartz 1.8。如何检查是否有作业停止?有什么方法可以重新启动任何暂停或损坏的工作?

4

3 回答 3

9

您可以轻松检索您的作业触发状态

石英 2.x 的示例:

// get the scheduler factory bean from the spring context
Scheduler scheduler = (Scheduler) getApplicationContext().getBean("schedulerFactoryBean");
// get the TriggerKey 
TriggerKey triggerKey = TriggerKey.triggerKey("serviceCronTrigger");
// get the state from the triggerKey
TriggerState triggerState = scheduler.getTriggerState(triggerKey); 

对于石英 1.8

根据 API 文档,Scheduler.getTriggerState(String triggerName, String triggerGroup)可以告诉您特定触发器的状态,返回以下常量之一:Trigger.STATE_NORMAL, Trigger.STATE_PAUSED, Trigger.STATE_COMPLETE, Trigger.STATE_ERROR, Trigger.STATE_BLOCKED, Trigger.STATE_NONE

 // get the scheduler factory bean from the spring context
 Scheduler scheduler = (Scheduler)   getApplicationContext().getBean("schedulerFactoryBean");
 // get the state 
 int state = scheduler.getTriggerState(triggerName, triggerGroup);
于 2013-07-03T11:28:20.767 回答
3

使用jwatch非常容易配置。它还提供了一个Restful-api,它将以 JSON 格式返回有关作业和调度程序的所有信息,以便您可以轻松解析并显示在 jsp 页面上。用于监视所有作业的示例 url实例会像

http://localhost:8081/jwatch/ui?action=monitor_jobs

响应非常简单:

data: [
    {
      calendarName: "",
      fireTime: "06/30/11 15:59:01 EDT",
      jobGroup: "group0",
      jobName: "j_1",
      jobRunTime: 0,
      nextFireTime: "06/30/11 16:00:01 EDT",
      previousFireTime: "06/30/11 15:58:01 EDT",
      quartzInstanceId: "f5c1edd6-0101-4c93-9162-58ca104b8fdb",
      recovering: false,
      refireCount: 0,
      scheduledFireTime: "06/30/11 15:59:01 EDT",
      schedulerId: "MEGA",
      schedulerName: "MegaScheduler",
      triggerGroup: "group0",
      triggerName: "t_1"
    },
    {
      calendarName: "",
      fireTime: "06/30/11 15:59:01 EDT",
      jobGroup: "group1",
      jobName: "j_1",
      jobRunTime: 0,
      nextFireTime: "06/30/11 16:00:01 EDT",
      previousFireTime: "06/30/11 15:58:01 EDT",
      quartzInstanceId: "f5c1edd6-0101-4c93-9162-58ca104b8fdb",
      recovering: false,
      refireCount: 0,
      scheduledFireTime: "06/30/11 15:59:01 EDT",
      schedulerId: "MEGA",
      schedulerName: "MegaScheduler",
      triggerGroup: "group1",
      triggerName: "t_1"
    },...

资料来源:点击这里

于 2013-07-03T11:05:23.893 回答
1

我刚刚对 Quartz 1.8.6 做了一些试验和错误,并参考了@willome 的答案,我想把我的工作代码放在这里:

我从上下文中收到了 Scheduler 的对象:

Scheduler scheduler = (Scheduler) SpringContextService.getBean(context,"scheduler");

然后通过使用调度器对象,我得到了我在石英配置中提到的名称的触发器对象:

Trigger cronTrigger = scheduler.getTrigger("cronTrigger", Scheduler.DEFAULT_GROUP);

并通过触发器对象(它是一个抽象类)我得到getPreviousFireTime();getNextFireTime();根据我的 cron 表达式,并使用 ajax 我通过调用 spring 控制器获得关于我选择的时间间隔的最新更新。

谢谢大家

于 2013-07-08T05:25:33.747 回答