Как я могу увидеть пункт назначения сообщения nserviceBus?

В версии 5 nServiceBus у меня есть поведение, которое отслеживает сообщения в пути.

В поведении я смог получить доступ к DeliveryOptions (SendOptions) и увидеть очередь назначения, в NSB 6 с изменением поведения я больше не могу получить доступ к месту назначения сообщения.

Кто-нибудь знает, как получить доступ к месту назначения исходящего сообщения из поведения?

Предыдущий код в v5:

 public class PendingCommandBehavior : IBehavior<OutgoingContext>
 {
        public void Invoke(OutgoingContext context, Action next)
        {
            var sendOptions = context.DeliveryOptions as Nsb.Unicast.SendOptions;
            if (sendOptions != null && context.OutgoingMessage.MessageIntent == Nsb.MessageIntentEnum.Send)
            {
                var destinationEndpoint = sendOptions.Destination.Queue;

Код в v6:

 public class PendingCommandBehavior : Behavior<IOutgoingSendContext>
    {
        public override async Task Invoke(IOutgoingSendContext context, Func<Task> next)
        {
            // context doesn't have any destination queue information???

person shenku    schedule 22.11.2017    source источник


Ответы (1)


IOutgoingSendContext находится слишком рано в конвейере, чтобы захватить физическое место назначения. Каждая исходящая операция отправки будет проходить через следующие контексты (по порядку) в NServiceBus версии 6:

  • IOutgoingSendContext
  • IOutgoingLogicalMessageContext
  • IOutgoingPhysicalMessageContext
  • IRoutingContext
  • IBatchDispatchContext (если вы отправляете из обработчика сообщений)
  • IDispatchContext

После IOutgoingSendContext выбирается стратегия маршрутизации, но она не преобразуется в физический адрес до IRoutingContext.

По этой причине, если вы хотите отслеживать физические адреса, лучше всего сидеть в IDispatchContext. Этот контекст будет содержать набор TransportOperations, каждый из которых имеет AddressTag. Это будет либо экземпляр UnicastAddressTag с Destination, либо экземпляр MulticastAddressTag с MessageType.

Вот некоторый код, чтобы вы начали:

public override Task Invoke(IDispatchContext context, Func<Task> next)
{
    foreach (var operation in context.Operations)
    {
        if (operation.AddressTag is UnicastAddressTag unicastAddressTag)
        {
            var destinationEndpoint = unicastAddressTag.Destination;
        }
    }

    return next();
}

Дополнительные сведения о конвейере NServiceBus версии 6 см. в разделе Шаги, этапы и соединители в документации NServiceBus.

person Mike Minutillo    schedule 22.11.2017