使用 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 发送一条消息,告诉它继续它的过程和/或将它标记为完成并关闭它。
关于c# - 第一次发送消息到错误队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38203288/