2016-08-18 40 views
1

我的應用程序正在使用Hangfire進行後臺作業處理。 我創建的後臺作業如下:使用ContinueWith時,在Hangfire中排隊的子作業有哪些優先級?

var parentJobId = _backgroundJobClient.Enqueue<IMyService>(x => x.ParentMethod(id)); 
_backgroundJobClient.ContinueWith<IMyService>(parentJobId, x => x.ChildMethod(id)); 

_backgroundJobClient.Enqueue<IMyService>(x => x.OtherMethod1(id)); 
_backgroundJobClient.Enqueue<IMyService>(x => x.OtherMethod2(id)); 

這些方法在服務定義如下:

public interface IMyService 
{ 
    [Queue(HangfireQueuePriority.Default)] 
    void ParentMethod(int id); 

    [Queue(HangfireQueuePriority.Default)] 
    void ChildMethod(int id);  

    [Queue(HangfireQueuePriority.Default)] 
    void OtherMethod1(int id); 

    [Queue(HangfireQueuePriority.Critical)] 
    void OtherMethod2(int id);  
} 

我想的ChildMethod要儘快父作業運行完畢。 我對ContinueWith的理解是,子作業在父作業之後運行,但在Hangfire文檔中未指定子任務將運行的時間。

我的問題是子任務相對於隊列中其他任務的「優先級」是什麼? 隊列中定義的任何任務是否有可能在ParentMethod和ChildMethod之間運行?例如OtherMethod1或OtherMethod2

回答

0

我的問題是子任務的優先級高於隊列中其他 任務的優先級?

All jobs in critical queues will be fetched first before default queues不管併發水平如何。

是否有機會在隊列中定義的任何任務在ParentMethod和ChildMethod之間運行 ?例如OtherMethod1或 OtherMethod2

從技術上講基於我的第一個回答你的第一個隊列中的關鍵隊列中的所有作業都將被取出的第一,這將包括您OtherMethod2。現在所有剩餘的作業都在Defaults Queue中,默認情況下,Hangfire設置爲根據可用數量Worker以併發方式執行作業。這意味着OtherMethod1可能會在ParentMethodChildMethod之間運行,因爲它們都在Default Queues之下。

+0

這很有道理。但是,有一點我不清楚。 在開始處理ParentMethod(在處理ChildMethod之前)之後,將緊急任務(OtherMethod2)添加到隊列時會發生什麼情況? 首先處理哪個任務:Crital任務(OtherMethod2)或ChildMethod任務? –

0

對於這個問題,我使用了2個hangfire服務器。 第一個使用這樣的隊列「繼續,默認」 第二個這樣的「默認,繼續」

您繼續必須在繼續隊列中。

因此,當一個任務進入繼續隊列時,如果第一個被佔用,第二個服務器就會佔用它,即使它被默認作業佔用。

我使用這個,因爲當我有一個成千上萬的隊列和數千個繼續的批處理時,我想要2個隊列並行運行。