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