这是我的情景:
向nservicebus发送消息的模式触发,此模式可以触发x次,但我只需要发送最新消息。我可以使用多个传奇(每个消息1个)这样做但是为了清洁我想在1个传奇中做到这一点。
这是我的Bus.Send
busService.Send(new PendingMentorEmailCommand()
{
PendingMentorEmailCommandId = mentorshipData.CandidateMentorMenteeMatchID,
MentorshipData = mentorshipData,
JobBoardCode = Config.JobBoardCode
});
命令处理程序:
public void Handle(PendingMentorEmailCommand message)
{
Data.PendingMentorEmailCommandId = message.PendingMentorEmailCommandId;
Data.MentorshipData = message.MentorshipData;
Data.JobBoardCode = message.JobBoardCode;
RequestTimeout<PendingMentorEmailTimeout>(TimeSpan.FromSeconds(PendingMentorEmailTimeoutValue));
}
超时:
public void Timeout(PendingMentorEmailTimeout state)
{
Bus.Send(new PendingMentorEmailMessage
{
PendingMentorEmailCommandId = Data.PendingMentorEmailCommandId,
MentorshipData = Data.MentorshipData,
JobBoardCode = Data.JobBoardCode
});
}
消息处理程序:
public void Handle(PendingMentorEmailMessage message)
{
ResendPendingNotification(message);
}
在我的重新发送方法中,我需要根据支票发送电子邮件...
// is there another (newer) message in the queue?
if (currentMentorShipData.DateMentorContacted == message.MentorshipData.DateMentorContacted)
CurrentMentorShipData
是一个数据库拉取,用于获取消息时的值。
所以我在10:22运行第一条消息并预计在我什么也没做的时候会在10:25开火,但是当我在10:24发送第二条消息时,我只想在10点27分发出一条消息(更新的一个),并且在10:25没有什么可以解雇的,因为我的if条件应该在10:25失败。我正在思考发生了什么,Saga Data对象被第二条消息覆盖,导致两条消息在第一条和第二条消息的消息上用DateMentorContacted = 10:24触发,所以我的问题是如何我可以单独保留每条消息的数据吗?
如果我能解释其他任何内容,请告诉我,我是nServiceBus&amp;的新手。我们试图提供尽可能详细的信息。
答案 0 :(得分:1)
听到此声明“我只需要发送最新消息”,我认为对于给定的特定于应用程序的ID(在您的情况下可能是CandidateMentorMenteeMatchID)也是如此。
我会在你的传奇中使用该ID作为相关ID,这样你最终会得到一个每个ID的传奇实例。
接下来,我有saga本身过滤掉不必要的消息发送。
这可以通过存储在传奇上的一种序列号并在超时数据中传回来完成。然后,在您的超时处理程序中,您可以将当前在saga上的序列号与超时数据中的序列号进行比较,这将告诉您在超时期间是否收到了另一条消息。只有序列号匹配才会发送最终导致电子邮件发送的消息。