当使用ContinueWith时,在Hangfire中排队的子作业的优先级是什么?

本文关键字:排队 子作业 优先级 是什么 Hangfire ContinueWith | 更新日期: 2023-09-27 18:03:06

我的应用程序使用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

当使用ContinueWith时,在Hangfire中排队的子作业的优先级是什么?

我的问题是子任务的"优先级"是什么队列中的任务?

关键队列中的所有作业都将在默认队列之前先取,无论并发级别如何。

队列中定义的任何任务是否有可能在ParentMethod和ChildMethod?例如:OtherMethod1或OtherMethod2

从技术上讲,基于我对您的第一个队列的第一个答案,关键队列中的所有作业将首先被获取,这将包括您的OtherMethod2。现在,所有剩余的作业都在Defaults Queue中,默认情况下,Hangfire设置为根据可用的Worker数量以并发方式执行作业。这意味着OtherMethod1有可能在ParentMethodChildMethod之间运行,因为它们都在Default Queues之下。

对于这个问题,我使用2个hangfire服务器。第一种是使用像这样的队列"Continue,Default"第二个像这样"Default,Continue"

你的continue with必须在continue队列中。

因此,当一个任务进入Continue队列时,如果第一个服务器被占用,第二个服务器将占用它,即使它被默认作业占用。

我使用这个是因为当我有数千个队列和数千个continuewith的批处理时,我希望这两个队列并行运行。