Rebus和NServiceBus应用程序之间的桥梁

时间:2014-02-08 06:41:32

标签: nservicebus rebus

在Rebus和NServiceBus应用程序之间提供桥接的最佳方法是什么?在我的应用程序中,需要向我的旧NServiceBus 2.0主机发送/接收消息。

通过深入了解,我觉得在Rebus中需要NServiceBusMessageFormatter。我不确定我要前往的方向。

1 个答案:

答案 0 :(得分:1)

我可以想象一下这方面的几个解决方案,可能会比我在这里描述的更简单。

例如,如果它只是为您的NServiceBus端点提供单向消息传递通道,您可以启动一个简单的Rebus端点,其实现为IHandleMessages<object>,将所有消息转发给NServiceBus端点 - 并且Rebus端点甚至可以托管在旧的NServiceBus端点中。

但是你声明你需要能够发送/接收消息,我读到这些消息就像你需要能够用你的NServiceBus端点做请求/回复一样。

为了实现这一点,我将NServiceBus端点视为我必须与之集成的任何其他东西。 NServiceBus端点有一个异步API,这意味着我必须能够以某种方式确定在收到NServiceBus回复时谁回复。

这可以通过两种方式实现,正如我所看到的那样:

  1. 稍微修改您的NServiceBus端点,将原始返回地址保留为所涉及消息的标题。
  2. 执行此操作,在发送到NServiceBus端点的请求中包含rebus-return-address标头值,并确保端点将此原始返回地址复制到发送回网桥的所有回复。

    这可以通过在请求中的自定义标头中存储原始Rebus返回地址来完成,然后使用NServiceBus&#39;钩子以确保将标头复制到从传统NServiceBus端点发送的任何回复。

    这样,您的网桥可以对收到的NServiceBus消息执行bus.Advanced.Routing.Send(originalRebusReturnAddress, reply),以便将回复显式路由回原始请求者。

    1. 使用传奇进行旧版终端之外的所有内务管理。
    2. 通过这种方式,您可以为每个传入的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可能看起来更简单(或者甚至更复杂;))