如何取消延迟的NServiceBus消息?

时间:2012-11-05 23:35:28

标签: nservicebus

假设我使用延迟消息传递功能在稍后的某个时间点发送消息,但稍后我可能想要取消该消息。

问题1 - 在进行原始bus.Defer(...)通话时,如何获取该消息的唯一标识符?我希望有某种消息ID或超时ID。

问题2 - 没有直接调用RavenDB数据库,有没有办法查询总线以获取所有挂起的延期消息?

问题3 - 是否有某种方法可以取消延期信息?我期待像bus.CancelDeferred(messageid)

这样的东西

这些是否可用,或者我是否可以使用其他机制来获得类似的结果?

2 个答案:

答案 0 :(得分:4)

我有必要放弃几次延期消息和未完成的回复,我通过“增加相关ID”来实现它。你没有提到传奇,所以我不确定这个解决方案是否适用于你。但是,我确实认为它属于你要求的“任何其他机制”:)

看看这个例子 - 这里我有我的传奇状态,除其他外,包含自定义CorrelationId

public class MySagaData : ISagaData
{
    // ... the usual stuff here

    public string CorrelationId { get; set; }
}

然后,每次我推迟消息或请求某些内容时,我都会将延迟消息和/或回复与相关ID的当前值相关联:

bus.Defer(time, new Something { CorrelationId = Data.CorrelationId });

bus.Send(new SomeRequest { CorrelationId = Data.CorrelationId });

因此在概念上将延迟消息和回复与传奇的当前状态相关联。

然后,如果我想放弃所有未完成的消息,我只需将saga的相关ID重新设置为新值 - 我通常将值设置为somethingWithBusinessMeaning/timestamp

这样,被遗弃的消息就不会与任何传奇实例相关联,实际上会被忽略。

有意义吗?

答案 1 :(得分:3)

1)目前无法做到这一点。如果您需要跟踪它们,可以添加自己的带有应用特定ID的标头

2)不,您必须在提及时查询存储空间。那说什么用例呢?

3)不,这是设计的。鉴于您无法假设消息何时到达,您不能依赖超时被取消,因为延迟消息可能会卡在队列中并在您取消后立即处理。 “取消”消息也可能丢失。

简而言之:无论如何,您的代码都需要准备好丢弃“无效”消息。