2016-08-18 5 views
1

Мое приложение использует Hangfire для обработки фоновой работы. создать фоновые задания следующим образом:Какой приоритет имеет установленное дочернее задание в Hangfire при использовании ContinueWith?

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 может работать между ParentMethod и ChildMethod, потому что они все под Default Queues.

+0

Это имеет смысл. Однако мне не ясно. Что произойдет, когда критическая задача (OtherMethod2) добавляется в очередь сразу после запуска ParentMethod (до обработки ChildMethod)? Какая задача будет обработана первой: задача Crital (OtherMethod2) или задача ChildMethod? –

0

Для этой проблемы я использую 2 сервера hangfire. Первый использует очереди типа «Продолжить, По умолчанию» Второй, как этот «По умолчанию», «Продолжить»

ваше продолжение должно быть в очереди «Продолжить».

Таким образом, когда задача входит в очередь «Продолжить», если первый занят, второй сервер берет его, даже если он занят заданием по умолчанию.

Я использую это, потому что, когда у меня есть партия с тысячами в очереди и тысячами, я хочу, чтобы две очереди выполнялись параллельно.