使用rebus和MSMQ取消待处理作业或执行作业的最佳策略是什么? (长跑)

时间:2015-09-16 16:43:18

标签: msmq rebus

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

1 个答案:

答案 0 :(得分:2)

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

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

我能想到的一种方法是利用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:AbortDispatch()上的IMessageContext功能可从0.98.11

获得