在 Rebus 和 NServiceBus 应用程序之间提供桥梁的最佳方式是什么?对于我的应用程序,需要向我的旧 NServiceBus 2.0 主机发送/接收消息。
通过深入研究,我觉得 Rebus 中需要 NServiceBusMessageFormatter。我不确定我要去的方向。
在 Rebus 和 NServiceBus 应用程序之间提供桥梁的最佳方式是什么?对于我的应用程序,需要向我的旧 NServiceBus 2.0 主机发送/接收消息。
通过深入研究,我觉得 Rebus 中需要 NServiceBusMessageFormatter。我不确定我要去的方向。
我可以想象出几种解决方案,并且可能有比我在这里向您描述的更简单的解决方案。
例如,如果它只是为您的 NServiceBus 端点提供单向消息传递通道,您可以启动一个简单的 Rebus 端点,IHandleMessages<object>
其实现将所有消息转发到 NServiceBus 端点 - 并且该 Rebus 端点甚至可以托管在内部您的旧 NServiceBus 端点。
但是您声明您需要能够发送/接收消息,我读到好像您需要能够使用您的 NServiceBus 端点进行请求/回复。
为了实现这一点,我会将 NServiceBus 端点视为必须与之集成的任何其他东西。不过,NServiceBus 端点有一个异步 API,这意味着我必须能够以某种方式确定在收到 NServiceBus 回复时要回复谁。
正如我所见,这可以通过两种方式实现:
执行此操作,rebus-return-address
在发送到 NServiceBus 端点的请求中包含标头值,并确保端点将此原始返回地址复制到发送回网桥的所有回复中。
这可以通过将原始 Rebus 返回地址存储在请求的自定义标头中来完成,然后使用 NServiceBus 的挂钩来确保将标头复制到从旧 NServiceBus 端点发送的任何回复中。
这样,您的网桥可以bus.Advanced.Routing.Send(originalRebusReturnAddress, reply)
对接收到的 NServiceBus 消息进行处理,以便将回复显式路由回原始请求者。
这样,您将为Guid
每个传入的 Rebus 请求创建一个新的,并在其中启动一个带有该 guid 的 saga,以及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
});
}
}
这样,您的转发器 saga 可以通过其属性关联传入ForwardedReply
消息,并让 saga 处理程序将内容发送回原始发件人,其地址存储在 saga 中。CorrelationId
ReplyMessage
哇,这是一个很长的答案 - 我希望它对你有意义 :) 但请记住 - 根据您需要能够与旧端点一起使用的消息交换模式 - 一切可能看起来更简单(甚至更复杂 ;))