【问题标题】:Serialization problems using Rebus使用 Rebus 的序列化问题
【发布时间】:2014-02-06 06:53:43
【问题描述】:

我正在尝试在已经使用 MSMQ 传递消息的现有系统环境中插入 #Rebus。

当然,目的是让 Rebus 接管一切 ;-),但目前我无法更改任何已经使用 MSMQ 传输的现有代码。

所以,我想我可以在系统的新部分中使用 Rebus 并将消息发送到现有的应用程序队列,但是出了点问题。

我这样配置我的 Rebus:

_bus = Configure.With(new WindsorContainerAdapter(container))
    .Logging(l => l.ColoredConsole(LogLevel.Debug))
    .Transport(t => t.UseMsmqInOneWayClientMode())
    .MessageOwnership(d => d.FromRebusConfigurationSection())
    .Serialization(s => s.UseBinarySerializer())
    .CreateBus().Start();

它按计划发送消息,但是当我现有的应用程序尝试从队列中读取时,会引发异常:

"不能反序列化作为参数传递的消息。不能 识别序列化格式。”

有问题的方法调用是这样的:

// using System.Messaging.MessageQueue
receiveQueue.Receive(_queueTimeout, transaction);

通过代码我可以看到Rebus的DefaultFilter或多或少像我们的

https://github.com/rebus-org/Rebus/blob/1ab9b0a02883157de457e0b6106d289ace3a077e/src/Rebus.Snoop/Listeners/MsmqInteraction.cs#L567

return new MessagePropertyFilter
{
  Label = true,
  ArrivedTime = true,
  Extension = true,
  Body = true,
  Id = true,
  };

我们的 MessagePropertyFilter 是这样配置的:

var propertyFilter = new MessagePropertyFilter
{
    Id = true,
    Body = true,
    Label = true
};

这种细微的变化真的会导致异常吗?我们还使用 BinaryFormatter 来序列化消息。

任何帮助将不胜感激:-)

【问题讨论】:

    标签: serialization msmq rebus


    【解决方案1】:

    Rebus 有自己的消息格式化程序 RebusTransportMessageFormatter,这是 MSMQ 客户端将 MSMQ Message 的实际读/写委托给的东西。

    查看格式化程序中的 ReadWrite 方法 - 它们包含 Rebus 在使用 MSMQ 传输消息时使用的逻辑,无论选择何种序列化程序。

    如果要将 Rebus 直接用于现有的 MSMQ 解决方案,则现有解决方案必须能够像 Rebus 一样将消息序列化/反序列化到正文中。

    还要注意 Rebus 如何使用 Extension 属性来存储标头 - 这可能意味着您将无法从现有的 MSMQ 解决方案向 Rebus 发送消息,因为 Rebus 会假设有一个 Extension 流可以解释为 UTF7 编码的序列化标头值字典的字节。

    希望这会有所帮助:)

    【讨论】:

    • 嘿,谢谢。所以你真正想说的是#rebus 需要一个 MSMQ 适配器才能使用“常规”MSMQ 与现有系统环境无缝协作?能够在现有环境中插入#rebus 以立即利用您的出色工具肯定会很好:-)。
    • 是的 - 但我建议您像对待任何其他类型的集成一样对待与“旧版 MSMQ”的集成,即不是通过直接连接总线,而是通过与旧版部件之间的桥接
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-02
    • 2017-06-25
    相关资源
    最近更新 更多