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

时间:2019-04-05 14:31:28

标签: nservicebus

我是NServiceBus的新手,所以也许我在这里问的很愚蠢,但是有没有办法使NServiceBus不停止发送任何响应处理程序失败的消息而发送的消息?

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

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

  1. 寻找客户
  2. 开始数据库事务
  3. 将客户更新为好客户
  4. 发送一条CustomerUpgradedToGoodCustomerEvent消息
  5. 提交数据库事务

完全简单,世界上一切都很好。现在几个月后,其他人认为支付订单后会收到一封电子邮件,因此会在OrderPaidEvent上添加另一个处理程序来发送电子邮件。

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

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

这似乎是一个巨大的缺陷,并且由于我是新手,所以我确定我做错了什么,但我似乎无法弄清楚它是什么。

任何人的帮助都会很棒。

谢谢。

2 个答案:

答案 0 :(得分:2)

如何将您的过程代码分解为单独的处理程序? 此后,根据每个粒度任务的成功完成,将完成或不执行每个逻辑操作。

如果将Saga添加到组合中,则可以根据Saga中已完成的步骤来制定业务决策。

也许还可以阅读有关交易和NServiceBus here

的更多信息

答案 1 :(得分:0)

首先,我将在提交后发送CustomerUpgradedToGoodCustomerEvent。到那时,您可以确定事件确实发生了。

并回答您的问题:您可以使用db提交后和事件发布前引发的某些“ SendEmail”命令来处理电子邮件。如果该命令失败,则不会损害OrderPaid事件的处理。再次发送邮件时,可以重试并正常处理该命令。