2015-11-25 2 views
1

Как получить адрес источника в полученном сообщении?Как получить адрес источника в Rebus?

Контекст заключается в том, что я проектирую монитор для служебной шины, реализованной с помощью Rebus. Я использую шаблон публикации - подписки, поэтому сообщение всегда публикуется по теме. Монитор подписывается на все темы, чтобы контролировать, что служба отправляет что-то, и поэтому является живым и здоровым. Хотя в обработчике сообщения принятое сообщение не содержит никакого исходного адреса или информации, идентифицирующей публикацию службы. Это означает, что невозможно контролировать, какие службы живы и здоровы. Конечно, я могу создать атрибут «Сервис», идентифицирующий публикацию службы во всех сообщениях. Это означает, что каждая служба должна установить атрибут перед публикацией сообщения, которое я считаю немного громоздким. Исходный адрес есть и может идентифицировать публикацию службы.

ответ

0

Когда вы находитесь в обработчике сообщений Rebus, вы можете получить доступ к IMessageContext - либо путем его ввода вашим контейнером IoC (который является предпочтительным способом из-за улучшенной тестируемости), либо путем доступа к статическому свойству MessageContext.Current ,

Контекст сообщения дает вам доступ к нескольким вещам, где заголовки входящего транспортного сообщения могут использоваться для получения обратного адреса сообщения (которое по умолчанию установлено в очередь ввода отправителя).

Что-то вроде этого следует сделать трюк:

public class SomeHandler : IHandleMessages<SomeMessage> 
{ 
    readonly IMessageContext _messageContext; 

    public class SomeHandler(IMessageContext messageContext) 
    { 
     _messageContext = messageContext; 
    } 

    public async Task Handle(SomeMessage message) 
    { 
     var headers = _messageContext.TransportMessage.Headers; 
     var returnAddress = headers[Headers.ReturnAddress]; 

     // .. have fun with return address here 
    } 
} 
Смежные вопросы