如何防止NServiceBus不发送错误消息

如何防止NServiceBus不发送错误消息,nservicebus,Nservicebus,我是NServiceBus的新手,所以可能我在这里问了一些非常愚蠢的问题,但是有没有一种方法可以让NServiceBus不停止发送响应处理程序失败的消息而发送的任何消息 让我用一个简单的例子来解释 假设我有一个OrderPaidEvent,它有一个执行以下操作的处理程序: 寻找顾客 启动数据库事务 将客户更新为好客户 发送CustomerUpgradedToGoodCustomerEvent消息 提交数据库事务 很简单,世界上一切都很好。现在,几个月后,另一个人认为,当订单被支付时,发送一封电子

我是NServiceBus的新手,所以可能我在这里问了一些非常愚蠢的问题,但是有没有一种方法可以让NServiceBus不停止发送响应处理程序失败的消息而发送的任何消息

让我用一个简单的例子来解释

假设我有一个
OrderPaidEvent
,它有一个执行以下操作的处理程序:

  • 寻找顾客
  • 启动数据库事务
  • 将客户更新为好客户
  • 发送
    CustomerUpgradedToGoodCustomerEvent
    消息
  • 提交数据库事务
  • 很简单,世界上一切都很好。现在,几个月后,另一个人认为,当订单被支付时,发送一封电子邮件会很好,因此在
    OrderPaidEvent
    中添加了另一个处理程序来发送电子邮件

    不幸的是,现在每当邮件服务器出现问题时,第二个处理程序将失败并出现错误,但这将阻止原始
    CustomerUpgradedToGoodCustomerEvent
    消息的发送(步骤4)。但是,由于DB事务已经提交(步骤5),客户已经升级为数据库中的好客户

    这意味着,即使重试了
    OrderPaidEvent
    处理程序,客户也不再更改,因此永远不会发送
    CustomerUpgradedToGoodCustomerEvent
    消息。更糟糕的是,这都是因为对代码的更改与原始消息处理程序无关,因此很难检测到

    这似乎是一个巨大的缺陷,因为我是新来的,我肯定我做错了什么,但我似乎不知道是什么

    你们这些好人的任何帮助都会很好


    提前感谢。

    将过程代码分解为单独的处理程序如何? 此后,基于每个粒度任务的成功完成,每个逻辑操作要么完成,要么不完成

    如果你在组合中加入一个新的步骤,那么你就可以根据你的传奇故事中完成的步骤做出商业决策


    还可以阅读更多关于事务和NServiceBus的信息,如何将过程代码分解为单独的处理程序? 此后,基于每个粒度任务的成功完成,每个逻辑操作要么完成,要么不完成

    如果你在组合中加入一个新的步骤,那么你就可以根据你的传奇故事中完成的步骤做出商业决策


    还可以阅读更多关于事务和NServiceBus的信息。首先,在提交之后,我会发送CustomerUpgradedToGoodCustomerEvent。在这一点上,你可以确定事件确实发生了


    在回答您的问题时:您可以在db commit之后和事件发布之前使用一些“sendmail”命令来处理电子邮件。如果该命令失败,则不会影响OrderPaid事件的处理。当邮件再次启动时,该命令可以重试并正常处理。

    首先,我会在提交后发送CustomerUpgradedToGoodCustomerEvent。在这一点上,你可以确定事件确实发生了


    在回答您的问题时:您可以在db commit之后和事件发布之前使用一些“sendmail”命令来处理电子邮件。如果该命令失败,则不会影响OrderPaid事件的处理。当邮件再次启动时,可以重试该命令并正常处理。

    此处出现问题。您所期望的是NServiceBus所做的。请随时向特定的网络技术支持部门发送电子邮件并请求支持。您的意思是它不发送来自第一个处理程序的消息,还是不发送?我已经向get-help地址发送了一条消息,但是我还没有收到回复。不确定get-help地址是什么?向特定的网络技术支持部门发送电子邮件。这就是问题所在,感觉像是代码中的设计缺陷。您的电子邮件失败-如果设计正确-与您的其他事件/消息没有任何关系。我会试试看,获取帮助地址在您获得扩展许可证时收到的“发件人”Udi邮件中。这里有问题。您所期望的是NServiceBus所做的。请随时向特定的网络技术支持部门发送电子邮件并请求支持。您的意思是它不发送来自第一个处理程序的消息,还是不发送?我已经向get-help地址发送了一条消息,但是我还没有收到回复。不确定get-help地址是什么?向特定的网络技术支持部门发送电子邮件。这就是问题所在,感觉像是代码中的设计缺陷。您的电子邮件失败-如果设计正确-与您的其他事件/消息没有任何关系。我会试试看,获取帮助地址在您获得扩展许可证时收到的“发件人”Udi邮件中。