如何告诉NServiceBus重试消息?

时间:2014-06-13 08:48:41

标签: nservicebus

我有一个流程,必须提醒管理员,如果某些业务逻辑不符合,则会自动重试该消息。

目前我所做的是抛弃Exception强制NServiceBus重试该消息。

我有一种感觉,这不是我应该做的。这是正确的做法吗?

public void Handle(ImportantCmd message)
{
    //do some awesome business logic here
    ..a business logic is not meet..

    //send email alert in case of error
    Bus.Publish<SendEmailCmd>(email =>
    {
        email.To = "pooradmin@awesomecompany.com";
        email.Title = "Important title";
        email.Body = "Important message";
     });

    //then force NServiceBus to retry
    throw new Exception("Blah blah...., retrying this message.");
 }

更新:我希望管理员在遇到某些条件时得到警报,并且他/她应该能够看到所有受影响的消息(可能在专用队列中?)并可能重试它们。

基本上我们的服务取决于外部服务。这种外部服务偶尔会返回错误的响应(但如果我们重试它可能会有效)。这就是我警告管理员并同时重试它们的原因。

2 个答案:

答案 0 :(得分:2)

NServiceBus的重试机制(由抛出异常驱动)应该是开发人员需要查看的基础结构问题(死锁,服务器不可用,彻头彻尾的错误等)。这样就可以在自动重试时处理瞬态失败(死锁,Web服务关闭),并且永久性错误(哎呀看起来像我除以零!)会进入错误队列,以便开发人员找出并采取管理操作。 / p>

现在,如果您的端点是事务性的,那么上面的代码将无法正常工作,因为消息处理程序中的所有内容都在事务中。这意味着如果你抛出异常,你的Bus.Publish(或Bus.Send,你不能/不应该发布一个命令)实际上不会发生。

真的,我不明白什么样的业务逻辑需要警报和重试。你能详细说说吗?是什么让您的业务逻辑基于传入消息变得如此不确定?那可以做些什么吗?

但最终,这种业务逻辑听起来像是业务流程的一部分,应该在消息中表达,而不是在错误和重试中。因此,如果某个条件意味着您需要通知某人以及其他内容,请发布ThingHappened事件(订阅者可以发送电子邮件),然后让另一个处理程序执行处理该业务流程所需的任何操作。如果这意味着,在将来,一个新的命令通过大致相同的数据,那么就是这样。

答案 1 :(得分:2)

鉴于你的更新(我假设管理员不会改变消息)我会说你可以使用FLR(第一级重试)和SLR(二级重试)来重试消息作为你正在调用的web服务最终将能够处理您的消息。

如果失败,则消息将以错误队列结束。

您可以通过使用它的API轮询ServiceControl来监视错误队列(如果您使用平台安装程序,它将使用NServiceBus安装ServiceControl)或订阅MessageFailed事件ServiceControl将在{{3}上发布like this spike code更多内容}。

这是David's blog

结帐a link about SLR

相关问题