protected override void Setup(FeatureConfigurationContext context)
    {
        var transportInfra     = context.Settings.Get <TransportInfrastructure>();
        var nativePubSub       = transportInfra.OutboundRoutingPolicy.Publishes == OutboundRoutingType.Multicast;
        var settingsCollection = context.Settings.Get <RouterConnectionSettingsCollection>();
        var unicastRouteTable  = context.Settings.Get <UnicastRoutingTable>();
        var bindings           = context.Settings.Get <QueueBindings>();

        var compiledSettings = new CompiledRouterConnectionSettings(settingsCollection);

        foreach (var connection in settingsCollection.Connections)
        {
            //Make sure router queue does exist.
            bindings.BindSending(connection.RouterAddress);

            //Send the specified messages through the router
            var route  = UnicastRoute.CreateFromPhysicalAddress(connection.RouterAddress);
            var routes = connection.SendRouteTable.Select(x => new RouteTableEntry(x.Key, route)).ToList();
            unicastRouteTable.AddOrReplaceRoutes("NServiceBus.Router_" + connection.RouterAddress, routes);
        }

        if (transportInfra.OutboundRoutingPolicy.Publishes == OutboundRoutingType.Unicast)
        {
            //Register the auto-publish-to-router behavior

            var autoSubscribeRouters = settingsCollection.Connections.Where(x => x.EnableAutoSubscribe).Select(x => x.RouterAddress).ToArray();
            context.Pipeline.Register(b => new RouterAutoSubscribeBehavior(autoSubscribeRouters, b.Build <ISubscriptionStorage>()), "Automatically subscribes routers to published events.");
        }


        context.Pipeline.Register(new ForwardSiteMessagesToRouterBehavior(), "Routes messages sent to sites to the bridge.");
        context.Pipeline.Register(new RoutingHeadersBehavior(compiledSettings), "Sets the ultimate destination endpoint on the outgoing messages.");
        context.Pipeline.Register(new CorrelationIdForReplyBehavior(), "Copy previous correlation ID for reply");

        var isSendOnlyEndpoint = context.Settings.GetOrDefault <bool>("Endpoint.SendOnly");

        if (!isSendOnlyEndpoint)
        {
            var distributorAddress = context.Settings.GetOrDefault <string>("LegacyDistributor.Address");
            var subscriberAddress  = distributorAddress ?? context.Settings.LocalAddress();

            context.Pipeline.Register(b => new RouterSubscribeBehavior(subscriberAddress, context.Settings.EndpointName(), b.Build <IDispatchMessages>(), compiledSettings, nativePubSub),
                                      "Dispatches the subscribe request via a router.");
            context.Pipeline.Register(b => new RouterUnsubscribeBehavior(subscriberAddress, context.Settings.EndpointName(), b.Build <IDispatchMessages>(), compiledSettings, nativePubSub),
                                      "Dispatches the unsubscribe request via a router.");
        }
    }
示例#2
0
 public RouterSubscribeBehavior(string subscriberAddress, string subscriberEndpoint, IDispatchMessages dispatcher, CompiledRouterConnectionSettings compiledSettings, bool nativePubSub)
 {
     this.subscriberAddress  = subscriberAddress;
     this.subscriberEndpoint = subscriberEndpoint;
     this.dispatcher         = dispatcher;
     this.compiledSettings   = compiledSettings;
     this.nativePubSub       = nativePubSub;
 }
示例#3
0
 public RoutingHeadersBehavior(CompiledRouterConnectionSettings compiledSettings)
 {
     this.compiledSettings = compiledSettings;
 }
示例#4
0
 public RouterUnsubscribeBehavior(string subscriberAddress, string subscriberEndpoint, IDispatchMessages dispatcher, CompiledRouterConnectionSettings compiledSettings, bool invokeTerminator)
 {
     this.subscriberAddress  = subscriberAddress;
     this.subscriberEndpoint = subscriberEndpoint;
     this.dispatcher         = dispatcher;
     this.compiledSettings   = compiledSettings;
     this.invokeTerminator   = invokeTerminator;
 }