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