gpt4 book ai didi

msmq - 使用 rebus 和 MSMQ 取消挂起作业或执行作业的最佳策略是什么? (长时间运行)

转载 作者:行者123 更新时间:2023-12-02 01:33:39 24 4
gpt4 key购买 nike

我有一个网络应用程序通过 rebus 发送消息以在远程机器上启动长时间运行的作业。我正在使用 MSMQ 传输。远程 worker 可以并行处理 5 个操作。因此,如果远程工作人员很忙,一些消息可能会堆积在队列中,直到工作人员可以处理它们。同时,用户可能决定取消挂起的操作(或正在执行的操作)。在使用 rebus(或与此相关的任何总线)时处理这种特定情况的最佳策略是什么?

最佳答案

好吧,由于队列是不透明的,并且端点只能看到它实际尝试接收的消息,所以实际上没有办法在接收消息之前对其进行过滤。

根据不做不必要的工作对您的重要性,我可以想出几种方法在处理开始之前中止处理。

我能想到的一种方法是利用 Rebus 在 handler pipeline 中执行处理程序这一事实,这意味着您可以在消息执行之前拦截它们。

如果您的工作是由 DoWork 执行的,您可以像这样插入一个“过滤器”:

Configure.With(...)
.(...)
.Options(o => o.SpecifyOrderOfHandlers()
.First<AbortIfCancelled>()
.Then<DoWork>())
.Start();

然后您的 AbortIfCancelled 可能如下所示:

public class AbortIfCancelled : IHandleMessages<Work>
{
readonly IMessageContext _messageContext;
readonly ICancelWork _cancelWork;

public AbortIfCancelled(IMessageContext messageContext, ICancelWork cancelWork)
{
_messageContext = messageContext;
_cancelWork = cancelWork;
}

public async Task Handle(Work work)
{
if (await _cancelWork.WasCancelled(work))
{
_messageContet.AbortDispatch();
}
}
}

如果 ICancelWork 返回 true,则中止管道的其余部分。然后,您将必须实现 ICancelWork,例如通过将 bool 值填充到某个数据库中。


PS:IMessageContext 上的 AbortDispatch() 函数从 0.98.11 开始可用

关于msmq - 使用 rebus 和 MSMQ 取消挂起作业或执行作业的最佳策略是什么? (长时间运行),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32614243/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com