2013-11-14 25 views
2

我有一個實現Job的類「Applier」。 均值類「Applier」是Quartz Job的一個實例。如何限制石英調度程序中特定類併發執行的作業實例數量?

我的要求是控制一次執行「Applier」實例的數量。 意思是我想限制一次,最多5次執行「Applier」實例。 如果第6個「Applier」實例到來並且有5個實例已經執行,那麼它必須等待直到「Applier」的一個實例完成。

Quartz Scheduler中是否有任何等待/通知類型機制?意味着如果第6個Job的實例試圖運行,並且第5個實例已經執行的第5個實例在5個實例執行完成後必須等待並通知。

意思是我想爲Job的特定實例實現一些ThreadPool類型的機制。 我不想要ThreadPool在Quartz Scheduler級別b'coz像mechanisum它已經由Quartz Scheduler提供。

+0

我的情況是許多石英工作JOB單一工作(Quartz類)塞納里奧。 工作(石英工作) - >工作(石英班) 多對一 我已經把我所有的「Applier」班放在同一組裏。 我也把觸發器放在同一組中。 我嘗試使用JobListner進行控制,但Quartz的「調度程序」類的「pauseJob」不適用於僅執行一次執行的計劃的JOB。 我無法找到任何可以「暫停」特定組執行的機制。 我也檢查「JobFactory」,但它在我的情況下也沒有用。 – Hitesh

回答

1

我不確定您是否知道這一點,但是,所有工作都是jobkey唯一的。

讓我們開始對這個答案的公約

JOB - 這意味着一個石英工作

工作 - 石英作業類

正如我前面提到可以有隻有一個作業的一個實例。發生這種情況的是,每個作業由一個作業鍵定義,現在作業鍵始終是唯一的

這意味着通常您在JOB和作業之間有一對一的映射,即預定作業(Quartz作業和類實現接口作業

這是JOB - >作業

CASE 1

作業的

多個實例和工作不是多個實例

將看起來像

JOB A - > Job |

作業B - >招聘| ...........多個作業運行同一類

作業C - >招聘|

只要保持在同一jobgroup不同jobkey讓你工作的多個實例加載到您的調度

看一看JobFactory因爲

一個的JobFactory負責生產工作的情況下,類。

..

CASE 2

現在來作業的實例。根據您的日程安排和JOB的執行時間,可能會有多個併發運行的實例(將其稱爲多個實例更好的術語將是併發執行是不恰當的)。爲了避免你將不得不編寫一些自定義邏輯。 或使用註釋DisallowConcurrentExecution

加載具有DisallowConcurrentExecution的CASE 1中所示的Job的5個實例。但這將意味着5個不必要的事例,儘管在某個時候可能不需要這項工作。

CASE 3

現在讓我們來考慮設置初始化爲1.自定義邏輯可以幫助處理這個

開始之前,你工作的標誌。您可以檢查該標誌是否小於5.如果小於5則進入主業務邏輯並增加標誌值。在塊出來之前執行結束後遞減它。這樣,即使您有多個JOB正在運行,也不會執行業務邏輯。

private static int jobRunningFlag = 0; 

    @Override 
public void execute(JobExecutionContext context) throws JobExecutionException { 
    if(JobName.jobRunningFlag <= 5) 
     { 
      JobName.jobRunningFlag++ 
    .....execute this piece of code.... 
      JobName.jobRunningFlag-- 
    } 
} 

顯然jobRunningFlag將存儲在同一個作業類的靜態變量

PS: 更多的答案,這將根據您的意見。你看過JobFactory和相關的類/接口嗎?你有什麼嘗試。我的想法是這將完全落實到你的實現邏輯上。我對石英不太瞭解,對他們沒有太多的想法。

+1

我的案例是許多石英作業工作單(Quartz類)塞納里奧。 工作(石英工作) - >工作(石英班) 多對一 我已經把我所有的「Applier」班放在同一組裏。 我也把觸發器放在同一組中。 我嘗試使用JobListner進行控制,但Quartz的「調度程序」類的「pauseJob」不適用於僅執行一次執行的計劃的JOB。 我無法找到任何可以「暫停」特定組執行的機制。 我也檢查「JobFactory」,但它在我的情況下也沒有用。 JobFactory實現類不提供任何特殊的機制來「暫停」方法。 – Hitesh

+0

我也試圖想出一個辦法。你可以看看EJB調度器。或者歸結爲像CASE 3這樣的戲劇,這意味着定製邏輯。我將更新一些東西給我的答案嘗試查看它們 – Acewin

+0

在進入執行方法調用時,首先檢查作業是否針對存儲在其中的標誌變量和值。並且將該作業的實際執行移入條件邏輯內 – Acewin

1

您可以限制同時運行的作業數(線程池),也可以將給定的作業實例限制爲只有一個併發實例。您不能將給定的作業限制爲僅給定數量的實例(1以外)。做你想做的唯一方法是隻爲一個給定的調度器運行一種工作,然後限制線程池到你想在同一個tieme上運行的工作數量