我是NServiceBus的新手,所以也许我在这里问的很愚蠢,但是有没有办法使NServiceBus不停止发送任何响应处理程序失败的消息而发送的消息?
让我用一个简单的例子来解释。
假设我有一个OrderPaidEvent
,它的处理程序可以执行以下操作:
CustomerUpgradedToGoodCustomerEvent
消息完全简单,世界上一切都很好。现在几个月后,其他人认为支付订单后会收到一封电子邮件,因此会在OrderPaidEvent
上添加另一个处理程序来发送电子邮件。
不幸的是,现在无论何时邮件服务器出现问题,第二个处理程序都将因错误而失败,但是该错误将阻止发送原始CustomerUpgradedToGoodCustomerEvent
消息(步骤4)。但是,由于数据库事务已经提交(第5步),因此客户已经升级为数据库中的好客户。
这意味着即使重试OrderPaidEvent
处理程序,客户也不会更改,因此永远不会发送CustomerUpgradedToGoodCustomerEvent
消息。更糟糕的是,这都是因为代码更改与原始消息处理程序无关,因此将很难检测到。
这似乎是一个巨大的缺陷,并且由于我是新手,所以我确定我做错了什么,但我似乎无法弄清楚它是什么。
任何人的帮助都会很棒。
谢谢。
答案 0 :(得分:2)
如何将您的过程代码分解为单独的处理程序? 此后,根据每个粒度任务的成功完成,将完成或不执行每个逻辑操作。
如果将Saga添加到组合中,则可以根据Saga中已完成的步骤来制定业务决策。
也许还可以阅读有关交易和NServiceBus here
的更多信息答案 1 :(得分:0)
首先,我将在提交后发送CustomerUpgradedToGoodCustomerEvent。到那时,您可以确定事件确实发生了。
并回答您的问题:您可以使用db提交后和事件发布前引发的某些“ SendEmail”命令来处理电子邮件。如果该命令失败,则不会损害OrderPaid事件的处理。再次发送邮件时,可以重试并正常处理该命令。