Как я могу увидеть пункт назначения сообщения 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???

1 ответ

Решение

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

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

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

По этой причине, если вы хотите отслеживать физические адреса, лучше всего сидеть в IDispatchContext, Этот контекст будет содержать коллекцию TransportOperationс, каждый из которых имеет 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.

Другие вопросы по тегам