TransportOperation RouteThroughLocalEndpointInstance(RoutingStrategy routingStrategy, IRoutingContext context)
    {
        Dictionary <string, string> headers = new Dictionary <string, string>(context.Message.Headers);
        AddressTag        originalTag       = routingStrategy.Apply(headers);
        UnicastAddressTag unicastTag        = originalTag as UnicastAddressTag;

        if (unicastTag == null)
        {
            MulticastAddressTag multicastTag = originalTag as MulticastAddressTag;
            if (multicastTag != null)
            {
                headers["$.store-and-forward.eventtype"] = multicastTag.MessageType.AssemblyQualifiedName;
            }
            else
            {
                throw new Exception("Unsupported type of address tag: " + originalTag.GetType().FullName);
            }
        }
        else
        {
            headers["$.store-and-forward.destination"] = unicastTag.Destination;
        }
        OutgoingMessage message = new OutgoingMessage(context.Message.MessageId, headers, context.Message.Body);

        return(new TransportOperation(message, new UnicastAddressTag(localAddress), DispatchConsistency.Default, context.Extensions.GetDeliveryConstraints()));
    }
示例#2
0
 public void Enrich(Activity activity, IOutgoingPhysicalMessageContext context)
 {
     var routes = context.RoutingStrategies
                  .Select(r => r.Apply(context.Headers))
                  .Select(t => t switch
     {
         UnicastAddressTag u => u.Destination,
         MulticastAddressTag m => m.MessageType.FullName,
         _ => null
     })
    protected override async Task <bool> Terminate(ForwardPublishContext context)
    {
        var addressTag      = new MulticastAddressTag(context.RootEventType);
        var outgoingMessage = new OutgoingMessage(context.MessageId, context.ForwardedHeaders, context.ReceivedBody);
        var operation       = new TransportOperation(outgoingMessage, addressTag);

        var forkContext = new PostroutingContext(null, operation, context);
        var chain       = context.Chains.Get <PostroutingContext>();
        await chain.Invoke(forkContext).ConfigureAwait(false);

        return(true);
    }
示例#4
0
    public Task Route(MessageContext context, IRawEndpoint dispatcher)
    {
        if (!context.Headers.TryGetValue(Headers.EnclosedMessageTypes, out var messageTypes))
        {
            throw new UnforwardableMessageException("Message need to have 'NServiceBus.EnclosedMessageTypes' header in order to be routed.");
        }
        var types = messageTypes.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries);

        var addressTag      = new MulticastAddressTag(typeGenerator.GetType(types.First()));
        var outgoingMessage = new OutgoingMessage(context.MessageId, context.Headers, context.Body);
        var operation       = new TransportOperation(outgoingMessage, addressTag);

        return(dispatcher.Dispatch(new TransportOperations(operation), context.TransportTransaction, context.Extensions));
    }
示例#5
0
        public async Task Should_use_to_all_subscribers_strategy()
        {
            var behavior = new MulticastPublishRouterBehavior();

            var context = new TestableOutgoingPublishContext
            {
                Message = new OutgoingLogicalMessage(typeof(MyEvent), new MyEvent())
            };

            MulticastAddressTag addressTag = null;
            await behavior.Invoke(context, _ =>
            {
                addressTag = (MulticastAddressTag)_.RoutingStrategies.Single().Apply(new Dictionary <string, string>());
                return(TaskEx.CompletedTask);
            });

            Assert.AreEqual(typeof(MyEvent), addressTag.MessageType);
        }
        public override void OnStartActivity(Activity activity, object payload)
        {
            if (!(payload is IOutgoingPhysicalMessageContext context))
            {
                return;
            }

            activity.SetKind(ActivityKind.Producer);

            context.Headers.TryGetValue(Headers.MessageIntent, out var intent);

            var routes = context.RoutingStrategies
                         .Select(r => r.Apply(context.Headers))
                         .Select(t => t switch
            {
                UnicastAddressTag u => u.Destination,
                MulticastAddressTag m => m.MessageType.Name,
                _ => null
            })