2009-08-21 192 views
1

我有一个NServiceBus应用程序,由于某些外部事件未发生,可能无法处理给定消息。因为这个其他事件不是NSB事件,所以我无法正确实施传说。NServiceBus延迟消息处理

但是,我不是将消息重新排队(这将导致一个循环,直到发生外部事件),而是将消息封装在另一条消息(DelayMessage)中,然后排队。 DelayMessage由不同的服务提取并放置在数据库中,直到重试间隔到期。此时,延迟服务将消息重新排队在原始队列上,以便可以进行另一次尝试。

但是,如果该外部事件还没有发生,这可能会发生多次,并且在甚至从不发生的情况下,我想限制消息所需的往返次数。这意味着DelayMessage具有MaxRetries属性,但延迟服务将原始消息排队以便重试时会丢失该属性。

我错过了什么其他选项?我很高兴接受这个问题有完全不同的解决方案。

回答

4

考虑实施存储第一条消息的saga,直到第二条消息到达为止。您可能还希望该传奇也打开timeout,以便您的过程不会无限期地等待,如果第二条消息丢失或什么的。

+0

哇自己 - 谢谢!我不能真正使用我不认为的传奇。只有一条消息,它在数据库中需要一些数据才能被处理。实际上我没有两条消息可以组合成一个传奇,数据是由一个传统存储过程创建的,我使用NSB添加引用它的其他数据。 – 2009-08-21 23:24:54

+0

然后使用saga中的超时来检查数据库中是否有数据 - 它会为您提供一个简单的轮询机制;没有数据,请求另一个超时。 – 2009-08-23 21:32:42