1

在 nServiceBus 的第 5 版中,我有一个跟踪飞行中消息的行为。

在行为中,我能够访问 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???
4

1 回答 1

6

IOutgoingSendContext管道中捕获物理目的地还为时过早。在 NServiceBus 版本 6 中,每个传出发送操作都将通过以下上下文(按顺序):

  • IOutgoingSendContext
  • IOutgoingLogicalMessageContext
  • IOutgoingPhysicalMessageContext
  • IRoutingContext
  • IBatchDispatchContext(如果您从消息处理程序内部发送)
  • IDispatchContext

IOutgoingSendContext选择了路由策略但直到之后才转换为物理地址之后IRoutingContext

出于这个原因,如果你想跟踪物理地址,最好的办法是坐在IDispatchContext. 此上下文将包含 s 的集合TransportOperation,每个 s 都有一个AddressTag. 这将是UnicastAddressTagwith aDestination的实例或MulticastAddressTagwith a 的实例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 文档中的步骤、阶段和连接器。

于 2017-11-22T07:34:58.863 回答