在Rebus和NServiceBus应用程序之间提供桥接的最佳方法是什么?在我的应用程序中,需要向我的旧NServiceBus 2.0主机发送/接收消息。
通过深入了解,我觉得在Rebus中需要NServiceBusMessageFormatter。我不确定我要前往的方向。
答案 0 :(得分:1)
我可以想象一下这方面的几个解决方案,可能会比我在这里描述的更简单。
例如,如果它只是为您的NServiceBus端点提供单向消息传递通道,您可以启动一个简单的Rebus端点,其实现为IHandleMessages<object>
,将所有消息转发给NServiceBus端点 - 并且Rebus端点甚至可以托管在旧的NServiceBus端点中。
但是你声明你需要能够发送/接收消息,我读到这些消息就像你需要能够用你的NServiceBus端点做请求/回复一样。
为了实现这一点,我将NServiceBus端点视为我必须与之集成的任何其他东西。 NServiceBus端点有一个异步API,这意味着我必须能够以某种方式确定在收到NServiceBus回复时谁回复。
这可以通过两种方式实现,正如我所看到的那样:
执行此操作,在发送到NServiceBus端点的请求中包含rebus-return-address
标头值,并确保端点将此原始返回地址复制到发送回网桥的所有回复。
这可以通过在请求中的自定义标头中存储原始Rebus返回地址来完成,然后使用NServiceBus&#39;钩子以确保将标头复制到从传统NServiceBus端点发送的任何回复。
这样,您的网桥可以对收到的NServiceBus消息执行bus.Advanced.Routing.Send(originalRebusReturnAddress, reply)
,以便将回复显式路由回原始请求者。
通过这种方式,您可以为每个传入的Rebus请求提供一个新的Guid
,并在其中启动一个带有该guid的传奇,以及来自传入请求的rebus-return-address
标头的值。然后,您可以将guid作为请求的NServiceBus相关ID分配给您的旧NServiceBus端点,该端点将自动复制到所有回复。
然后,回到桥中,创建一个特殊的消息包装器,可用于转发传入的NServiceBus消息(必须是来自旧端点的回复),如下所示:
public class ForwardedReply
{
public Guid CorrelationId { get; set; }
public object ReplyMessage { get; set; }
}
然后你在(仅)NServiceBus消息处理程序中执行类似的操作:
public class BridgeIncomingNsbMessagesToRebus : NServiceBus.IHandleMessages<object>
{
public Rebus.IBus Bus { get; set; }
public void Handle(object msg)
{
Bus.SendLocal(new ForwardedReply {
CorrelationId = GetCorrelationIdFrom(msg),
ReplyMessage = msg
});
}
}
这样,您的转发器传奇可以通过其ForwardedReply
属性关联传入的CorrelationId
消息,并让传奇处理程序将ReplyMessage
的内容发送回原始发件人,其地址已存储在传奇。
哇,这是一个很长的答案 - 我希望它对你有意义:)但是请记住 - 根据您需要能够与您的旧端点一起使用的消息传递模式 - eveyrything可能看起来更简单(或者甚至更复杂;))