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())); }
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); }
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)); }
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 })