在同一个传奇中发送多条消息

时间:2014-08-13 18:24:50

标签: asp.net persistence nservicebus

这是我的情景:

向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;的新手。我们试图提供尽可能详细的信息。

1 个答案:

答案 0 :(得分:1)

听到此声明“我只需要发送最新消息”,我认为对于给定的特定于应用程序的ID(在您的情况下可能是CandidateMentorMenteeMatchID)也是如此。

我会在你的传奇中使用该ID作为相关ID,这样你最终会得到一个每个ID的传奇实例。

接下来,我有saga本身过滤掉不必要的消息发送。

这可以通过存储在传奇上的一种序列号并在超时数据中传回来完成。然后,在您的超时处理程序中,您可以将当前在saga上的序列号与超时数据中的序列号进行比较,这将告诉您在超时期间是否收到了另一条消息。只有序列号匹配才会发送最终导致电子邮件发送的消息。