2

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

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

问题 2 - 没有直接调用 RavenDB 数据库,有没有办法查询总线以取回所有待处理的延迟消息?

问题 3 - 有什么方法可以取消延迟消息?我希望像bus.CancelDeferred(messageid)

是否有任何可用的,或者我可以使用任何其他机制来实现类似的结果?

4

2 回答 2

4

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

看看这个例子——这里我有我的传奇的状态,除其他外,它包含一个自定义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 的当前状态相关联

然后,如果我想放弃所有未处理的消息,我只需将 saga 的相关 ID 重新设置为一个新值——我通常将该值设置为somethingWithBusinessMeaning/timestamp.

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

是否有意义?

于 2012-11-06T15:12:47.760 回答
3

1)目前没有办法做到这一点。如果您需要跟踪它们,您可以使用特定于应用程序的 id 添加自己的标题

2)不,你必须查询你提到的存储。那就是说这个的用例是什么?

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

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

于 2012-11-06T08:55:09.233 回答