如何让Saga消息处理程序等待另一个句柄在NServiceBus中完成

时间:2014-10-24 05:08:21

标签: nservicebus nservicebus-sagas

我们最近开始在我们的项目中实施Nservice总线。我们是佐贺服务的新手,我们对以下情况感到震惊。

假设我们在saga中有4个步骤,saga将由message1启动。

消息2将由某些外部服务触发。我们必须处理message2,并且只在完成message1处理后才能运行很长时间。

我们怎样才能做到这一点?除了在消息2处理之后使用 Thread.Sleep 之类的东西,或者在检查消息1到达之后在消息2到达时在消息2到达时调用的常用方法之后,以及在消息2到达之后的消息1处理结束时。

我们没有使用服务矩阵。

提前致谢。

2 个答案:

答案 0 :(得分:0)

我会实施你的第二个建议。这与我们采用的方法类似。

因此,在您的SagaData中,您将拥有一个状态标志,指示Message1是否已成功处理,另一个状态标志指示是否已收到Message2,还存储处理Message2所需的任何属性。

在Message1处理程序的末尾,在Message2处理程序的属性存储部分之后,您将调用一个检查两个消息的状态标志的公共方法,如果两个状态标志都已设置,则继续Message2处理。

答案 1 :(得分:0)

您可以使用timeout feature执行以下操作:

当调用message2的处理程序时,检查message1是否已完成(saga数据中的属性)

  • 如果message1没有完成,请拨打 RequestTimeout

调用超时处理程序时:

  • 如果message1完成,则向执行该操作的处理程序发送消息 message2的工作单元

  • 如果message1没有完成,请执行另一个 RequestTimeout ,直到message1 是完整的处理

我强烈建议不要做任何类似线程睡眠的事情

有意义的剂量?