【问题标题】:Subscribe to messages published by NServiceBus 2.5 endpoint from NServiceBus 4.7.5 endpoint从 NServiceBus 4.7.5 端点订阅 NServiceBus 2.5 端点发布的消息
【发布时间】:2015-04-13 13:30:44
【问题描述】:

我有两个端点,一个是 NSB 2.5 并发布消息,一个是 NSB 4.7.5。我想订阅 NSB2 在我的 NSB4 端点中发布的事件,但是当我将订阅添加到 NSB4 端点时,我在 NSB2 端点中收到以下错误:

System.Xml.XmlException: Root element is missing.
   at System.Xml.XmlTextReaderImpl.Throw(Exception e)
   at System.Xml.XmlTextReaderImpl.ThrowWithoutLineInfo(String res)
   at System.Xml.XmlTextReaderImpl.ParseDocumentContent()
   at System.Xml.XmlTextReaderImpl.Read()
   at System.Xml.XmlLoader.Load(XmlDocument doc, XmlReader reader, Boolean preserveWhitespace)
   at System.Xml.XmlDocument.Load(XmlReader reader)
   at NServiceBus.Serializers.XML.MessageSerializer.Deserialize(Stream stream) in c:\dev\v3\NServiceBus\src\impl\Seri
   at NServiceBus.Unicast.Transport.Msmq.MsmqTransport.Extract(Message message) in c:\dev\v3\NServiceBus\src\impl\uni
   at NServiceBus.Unicast.Transport.Msmq.MsmqTransport.ReceiveFromQueue() in c:\dev\v3\NServiceBus\src\impl\unicast\N

我的 NSB2 错误队列中有以下内容:

<?xml version="1.0"?>
<ArrayOfHeaderInfo xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <HeaderInfo>
    <Key>NServiceBus.MessageId</Key>
    <Value>7ffbe1e3-9b2c-456c-bcb7-a43d011a2389</Value>
  </HeaderInfo>
  <HeaderInfo>
    <Key>NServiceBus.CorrelationId</Key>
    <Value>7ffbe1e3-9b2c-456c-bcb7-a43d011a2389</Value>
  </HeaderInfo>
  <HeaderInfo>
    <Key>NServiceBus.OriginatingEndpoint</Key>
    <Value>NSB4Client</Value>
  </HeaderInfo>
  <HeaderInfo>
    <Key>$.diagnostics.originating.hostid</Key>
    <Value>75e8656bb268f44ded5f2a82b8798e6a</Value>
  </HeaderInfo>
  <HeaderInfo>
    <Key>NServiceBus.MessageIntent</Key>
    <Value>Subscribe</Value>
  </HeaderInfo>
  <HeaderInfo>
    <Key>NServiceBus.Version</Key>
    <Value>4.7.5</Value>
  </HeaderInfo>
  <HeaderInfo>
    <Key>NServiceBus.TimeSent</Key>
    <Value>2015-02-12 17:07:14:158882 Z</Value>
  </HeaderInfo>
  <HeaderInfo>
    <Key>NServiceBus.OriginatingMachine</Key>
    <Value>xxx</Value>
  </HeaderInfo>
  <HeaderInfo>
    <Key>NServiceBus.ControlMessage</Key>
    <Value>True</Value>
  </HeaderInfo>
  <HeaderInfo>
    <Key>SubscriptionMessageType</Key>
    <Value>MyMessages.EventMessage, MyMessages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null</Value>
  </HeaderInfo>
</ArrayOfHeaderInfo>

我假设这是因为标头在 4 和 2 之间不兼容,在这种情况下,我应该能够使用 mutator 转换为兼容格式,但是我尝试使用 mutator 拦截 NSB4 端点上的传出消息但它似乎没有截获消息(同时使用 IMutateTransportMessages 和 IMutateMessages)

2015-02-16 更新 根据https://groups.google.com/forum/#!topic/particularsoftware/XVLQkCouKCk,订阅的传出修改器似乎在 4.3 中被禁用,这可以解释为什么我的传出修改器解决方案不起作用

【问题讨论】:

  • NServicebus 是向后兼容的(不向前),因此您可能可以通过其他方式实现这一点......消息变异器可能存在错误。我正在尝试验证,并会通知您

标签: nservicebus


【解决方案1】:

V2.5 期望消息被包装在根节点中,即使只发送了一条消息。该设置在 v4 中默认关闭。

通过调用打开它:

https://github.com/Particular/NServiceBus/blob/4.7.5/src/NServiceBus.Core/Settings/SerializationSettings.cs#L11

【讨论】:

  • 谢谢@Andreas 看起来像我想要的,但我似乎无法让它工作。这样做:public class EndpointConfig : IConfigureThisEndpoint, AsA_Server, IWantCustomInitialization { public void Init() { Configure.Serialization.Xml().WrapSingleMessages(); } } 我仍然收到错误消息,是我配置错了吗? (对不起格式)
  • 如果您查看到达 v2.5 端点的原始消息,xml 有效负载是否包含包装 &lt;Messages&gt; 元素?
  • 看起来不像,这是我在队列中看到的:pastebin.com/ZtFRtBzK
  • 这真的是邮件的正文吗? (看起来像标题)
  • 正文实际上是空的,大小为0字节。不知道为什么会这样。订阅消息正文通常应该是什么样子?
猜你喜欢
  • 2012-02-19
  • 1970-01-01
  • 1970-01-01
  • 2012-06-03
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多