当使用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
我的问题是子任务的"优先级"是什么队列中的任务?
关键队列中的所有作业都将在默认队列之前先取,无论并发级别如何。
队列中定义的任何任务是否有可能在ParentMethod和ChildMethod?例如:OtherMethod1或OtherMethod2
从技术上讲,基于我对您的第一个队列的第一个答案,关键队列中的所有作业将首先被获取,这将包括您的OtherMethod2
。现在,所有剩余的作业都在Defaults Queue
中,默认情况下,Hangfire设置为根据可用的Worker数量以并发方式执行作业。这意味着OtherMethod1
有可能在ParentMethod
和ChildMethod
之间运行,因为它们都在Default Queues
之下。
对于这个问题,我使用2个hangfire服务器。第一种是使用像这样的队列"Continue,Default"第二个像这样"Default,Continue"
你的continue with必须在continue队列中。
因此,当一个任务进入Continue队列时,如果第一个服务器被占用,第二个服务器将占用它,即使它被默认作业占用。
我使用这个是因为当我有数千个队列和数千个continuewith的批处理时,我希望这两个队列并行运行。