2014-02-04 4 views
2

Я пытаюсь подключить #Rebus в существующем системном ландшафте, уже использующем MSMQ для доставки сообщений.Проблемы с сериализацией с использованием Rebus

Конечно, цель состоит в том, чтобы позволить Rebus взять на себя все ;-), но на данный момент я не могу изменить какой-либо существующий код, уже работающий с транспортом MSMQ.

Итак, я думал, что могу просто использовать 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); 

Рытье через код, который я могу видеть, что 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 для сериализации сообщений.

Любая помощь будет принята с благодарностью :-)

ответ

2

Ребус имеет свое собственное сообщение форматировщик, RebusTransportMessageFormatter, что это то, что клиент делегирует MSMQ фактическое чтение/запись из MSMQ Message в.

Ознакомьтесь с методами Read и Write в формате форматирования - они содержат логику, которую использует Rebus при использовании MSMQ для передачи сообщений независимо от выбранного сериализатора.

Если Rebus должен использоваться непосредственно с существующим решением MSMQ, существующее решение должно обеспечивать сериализацию/десериализацию сообщений в теле так же, как это делает Rebus.

Обратите также внимание, как Ребус использует Extension свойства для хранения заголовков - это, вероятно, означает, что вы будете не в состоянии отправить сообщение из существующего MSMQ решения Ребуса, потому что Ребус предположит, что есть Extension потока байт, интерпретироваться как кодированный в формате UTF7, сериализованный словарь значений заголовков.

Надеюсь, что это поможет :)

+0

Эй, спасибо. Итак, что вы на самом деле говорите, что #rebus нуждается в MSMQ-адаптере для бесперебойной работы с существующими системными средами с использованием «обычного» MSMQ? Конечно, было бы неплохо иметь возможность подключать #rebus в существующих ландшафтах, чтобы сразу воспользоваться вашим удивительным инструментом :-). –

+0

Да, но я бы посоветовал вам относиться к интеграции с «устаревшим MSMQ», как и к любой другой интеграции, т. Е. Не подключаясь напрямую к шине, а вместо этого путем подключения к устаревшим частям – mookid8000

Смежные вопросы