c# - 第一次发送消息到错误队列

标签 c# error-handling nservicebus nservicebus4

使用 NServiceBus 4.3 我想在某些情况出现时向错误队列发送消息。

场景是当我收到一条消息时,我检查这条消息是否指的是我们数据库中的一项或多项。如果有多个引用,我会抛出一个 AmbiguousItemException 并捕获它。我需要通过电子邮件向负责给我正确信息的人员发送电子邮件。所有这些都已解决,但我不希望再次尝试此消息。相反,我宁愿将它移到错误队列中,这样当我们取回我们需要的信息时,我们可以添加 nullable 属性并将消息放回队列中进行处理。我试过使用 _bus.ForwardCurrentMessageTo("error")_bus.Send("error", message)_bus.SendLocal(message)。最后一个基本上将消息置于无限循环中。代码有点像这样。

public class MoveToErrorQueue
{
    private readonly IBus _bus;

    public MoveToErrorQueue(IBus bus)
    {
        _bus = bus;
    }

    public virtual void Send(ResubmitMessage message)
    {
        message.Foo= -1;
        _bus.Send("error", message);
    }
}

以及调用它的代码

        try
        {
            //removed for brevity
        }
        catch (AmbiguousItemException ex)
        {
            Log.Error(ex);
            sendNotificationCommand.FailureMessage = ex.Message;
            _moveToErrorQueue.Send(commandMesage);
        }
        SendNotification(sendScanningNotificationCommand);

最佳答案

根据您的描述,您似乎有一个长期运行的业务流程。这是using a Saga的候选人. Sagas 像处理程序一样处理传入消息,但 Saga 还允许您跟踪状态。因此,与其尝试将您的消息放入错误队列(这不是一个好主意),不如在 Saga 上设置某种类型的标志,如 bool 值或枚举,这将表明您收到了一条消息“引用数据库中的一项或多项”,如您所说。

设置标志后,您可以发出某种消息来通知您或任何需要向您的客户发送电子邮件以获取更新信息的人(这可能是自动的)。

一旦你收到必要的信息,你就可以采取任何必要的行动,然后向 Saga 发送一条消息,告诉它继续它的过程和/或将它标记为完成并关闭它。

You can learn more about Sagas here

关于c# - 第一次发送消息到错误队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38203288/

相关文章:

azure - 本地 NServicebus 应用程序从 Azure ServiceBus 队列接收消息

c# - 关于 EF Code First Fluent API、TPH 和外键的困难

c# - 将 xml 反序列化为 Linq to SQL 对象

c# - 获取 .NET 程序集的 AssemblyInformationalVersion 值?

c# - 如何处理鼠标事件

javascript - 调试Windows应用商店应用-错误消息始终显示相同的行号

c# - 获取通用 Windows 应用程序错误

javascript - 我的Promise捕获异常,我不知道如何打印错误消息

nservicebus - 有没有办法告诉 NServiceBus 不要重试消息?

c# - NServiceBus Ninject 在使用 ToMethod 时找不到 NinjectObjectBuilder 范围