2015-09-07 1 views
1

Я использую свой CustomFaultManager для обработки неудавшихся сообщений, поэтому я могу обработать их перед тем, как поместить их в очередь ошибок.Обработка пользовательских ошибок NServiceBus. Deserialization TransportMessage

в

void IManageMessageFailures.ProcessingAlwaysFailsForMessage(TransportMessage message, Exception e) 
{ 

я TransportMessage, и я должен получить вид из:

var header = message.Headers["NServiceBus.EnclosedMessageTypes"]; 
var messageType = MessageTypes.Where(x => x.AssemblyQualifiedName != null 
           && header.Contains(x.AssemblyQualifiedName)).ToList(); 

, а затем применить свою собственную логику, чтобы разархивировать сообщение (потому что я сжать большой MSMQ сообщение). Можно ли получить в этом методе сообщение, которое похоже на исходное сообщение, которое у меня есть в методе Handle?

Почему это меня беспокоит? Теперь мне нужно помнить о том, чтобы применять изменения в моем настраиваемом обработчике ошибок всякий раз, когда я меняю метод сериализации или метод zipping.

Я был бы счастлив, если бы я мог просто бросить TransportMessage к моей пользовательской реализации сообщений так же, как:

var myMessage = message as MyCustomMessage; 

Вы знаете, ребята, если есть способ сделать пользовательские обработки в NServiceBus ошибки, не делая ручную десериализацию?

Я попробовал кастинг на мой тип сообщения (как описано выше), но он продолжает давать мне пустой, как результат, потому что сообщение сериализовать в Message поле в TransportMessage

+0

Можете ли вы объяснить, что вы хотите достичь в пользовательской обработке ошибок и о том, какую версию NServiceBus вы используете. Тогда я смогу предоставить вам решение. Btw. IManageMessageFailures всегда работает на уровне TransportMessage, и поэтому вы не работаете на уровне логических сообщений (фактическая полезная нагрузка сообщения) –

+0

@ DanielMarbach Я использую NServiceBus 4.5. Я хочу получить сообщение непосредственно перед отправкой в ​​очередь ошибок. Я хочу получить его содержание (заброшенное как моя реализация пользовательских сообщений) и сделать с ним свою магию. До сих пор мне нужно иметь дело с «TransportMessage». – wudzik

+0

Возможно ли вам перейти на 5.0? С конвейером поведения это стало намного проще. –

ответ

1

Мы также на старой версии NServiceBus (3.x). До сих пор наше решение заключалось в том, чтобы наш обработчик сообщений улавливал все исключения, а затем обертывал их специальным исключением, которое содержит значения, которые нам нужны из сообщения. Затем мы бросаем это исключение для NServiceBus для обработки.

В нашей реализации IManageMessageFailures.ProcessingAlwaysFailsForMessage мы вызываем соответствующий обработчик ошибок на основе типа Exception, а также значений NServiceBus.EnclosedMessageTypes.

Надеюсь, это поможет.