簡體   English   中英

Spring:如何從控制器監視Quartz Job?

[英]Spring: How to Monitor Quartz Job from controller?

我在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。 如何檢查是否有任何工作停止? 我們有什么方法可以重新啟動任何停止或破壞的工作?

您可以輕松檢索作業觸發狀態

石英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);

使用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"
    },...

Soources: 點擊這里

我剛剛使用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 controller獲得我選擇的時間間隔的最新更新。

謝謝大家

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM