假设我使用延迟消息功能在以后的某个时间点发送消息,但稍后我可能想取消该消息。
问题 1 - 进行原始bus.Defer(...)
呼叫时,如何获取该消息的唯一标识符?我希望会有一个消息 id 或某种超时 id。
问题 2 - 没有直接调用 RavenDB 数据库,有没有办法查询总线以取回所有待处理的延迟消息?
问题 3 - 有什么方法可以取消延迟消息?我希望像bus.CancelDeferred(messageid)
是否有任何可用的,或者我可以使用任何其他机制来实现类似的结果?
假设我使用延迟消息功能在以后的某个时间点发送消息,但稍后我可能想取消该消息。
问题 1 - 进行原始bus.Defer(...)
呼叫时,如何获取该消息的唯一标识符?我希望会有一个消息 id 或某种超时 id。
问题 2 - 没有直接调用 RavenDB 数据库,有没有办法查询总线以取回所有待处理的延迟消息?
问题 3 - 有什么方法可以取消延迟消息?我希望像bus.CancelDeferred(messageid)
是否有任何可用的,或者我可以使用任何其他机制来实现类似的结果?
我有几次需要放弃延迟消息和未完成的回复,我通过在我的传奇中“增加相关 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 实例相关联,实际上会被忽略。
是否有意义?
1)目前没有办法做到这一点。如果您需要跟踪它们,您可以使用特定于应用程序的 id 添加自己的标题
2)不,你必须查询你提到的存储。那就是说这个的用例是什么?
3) 不,这是设计使然。鉴于您不能假设消息何时到达,您不能依赖超时被取消,因为延迟消息可能会卡在队列中并在您取消后立即处理。“取消”消息也可能会丢失。
简而言之:无论如何,您的代码都需要准备好丢弃“无效”消息。