我正在尝试在已经使用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或多或少像我们的
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来序列化消息。
非常感谢任何帮助: - )
答案 0 :(得分:2)
Rebus有自己的消息格式化程序RebusTransportMessageFormatter
,这是MSMQ客户端委派实际读取/写入MSMQ Message
的内容。
查看格式化程序中的Read
和Write
方法 - 它们包含Rebus在使用MSMQ传输消息时使用的逻辑,无论选择的序列化程序如何。
如果要将Rebus直接用于现有的MSMQ解决方案,现有解决方案必须能够像Rebus一样将消息序列化/反序列化到正文中。
另请注意Rebus如何使用Extension
属性存储标头 - 这可能意味着您将无法从现有的MSMQ解决方案向Rebus发送消息,因为Rebus将假设有{{1可以解释为UTF7编码的序列化字典值字典的字节流。
希望这会有所帮助:)