public void When_routing_to_specific_instance_should_select_appropriate_instance()
        {
            var table     = new UnicastRoutingTable();
            var instances = new EndpointInstances();

            table.AddOrReplaceRoutes("A", new List <RouteTableEntry>
            {
                new RouteTableEntry(typeof(MyMessage), UnicastRoute.CreateFromEndpointName("Endpoint"))
            });
            instances.AddOrReplaceInstances("A", new List <EndpointInstance>
            {
                new EndpointInstance("Endpoint", "1"),
                new EndpointInstance("Endpoint", "2"),
                new EndpointInstance("Endpoint", "3")
            });
            var router  = CreateRouter(routingTable: table, instances: instances);
            var options = new SendOptions();

            options.RouteToSpecificInstance("2");

            var context = CreateContext(options);

            var route = router.Route(context);

            Assert.AreEqual("Endpoint-2", ExtractDestination(route));
        }
    async Task UpdateCaches(EndpointInstance instanceName, Type[] handledTypes, Type[] publishedTypes)
    {
        var newInstanceMap  = BuildNewInstanceMap(instanceName);
        var newEndpointMap  = BuildNewEndpointMap(instanceName.Endpoint, handledTypes, endpointMap);
        var newPublisherMap = BuildNewPublisherMap(instanceName, publishedTypes, publisherMap);

        LogChangesToEndpointMap(endpointMap, newEndpointMap);
        LogChangesToInstanceMap(instanceMap, newInstanceMap);
        var toSubscribe = LogChangesToPublisherMap(publisherMap, newPublisherMap).ToArray();

        #region AddOrReplace

        routingTable.AddOrReplaceRoutes("AutomaticRouting", newEndpointMap.Select(
                                            x => new RouteTableEntry(x.Key, UnicastRoute.CreateFromEndpointName(x.Value))).ToList());

        publishers.AddOrReplacePublishers("AutomaticRouting", newPublisherMap.Select(
                                              x => new PublisherTableEntry(x.Key, PublisherAddress.CreateFromEndpointName(x.Value))).ToList());

        endpointInstances.AddOrReplaceInstances("AutomaticRouting", newInstanceMap.SelectMany(x => x.Value).ToList());

        #endregion

        instanceMap  = newInstanceMap;
        endpointMap  = newEndpointMap;
        publisherMap = newPublisherMap;

        foreach (var type in toSubscribe.Intersect(messageTypesHandledByThisEndpoint))
        {
            await messageSession.Subscribe(type)
            .ConfigureAwait(false);
        }
    }
Пример #3
0
    protected override void Setup(FeatureConfigurationContext context)
    {
        var rampSettings      = context.Settings.Get <RampSettings>();
        var unicastRouteTable = context.Settings.Get <UnicastRoutingTable>();
        var route             = UnicastRoute.CreateFromPhysicalAddress(rampSettings.BridgeAddress);
        var publishers        = context.Settings.Get <Publishers>();

        //Send the specified messages through the bridge
        var routes = rampSettings.SendRouteTable.Select(x => new RouteTableEntry(x.Key, route)).ToList();

        unicastRouteTable.AddOrReplaceRoutes("NServiceBus.Bridge", routes);

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

        var publisherAddress = PublisherAddress.CreateFromPhysicalAddresses(rampSettings.BridgeAddress);

        publishers.AddOrReplacePublishers("Bridge", rampSettings.PublisherTable.Select(kvp => new PublisherTableEntry(kvp.Key, publisherAddress)).ToList());

        context.Pipeline.Register(new SetUltimateDestinationEndpointBehavior(rampSettings.SendRouteTable), "Sets the ultimate destination endpoint on the outgoing messages.");
        context.Pipeline.Register(new SetCorrelationIdBehavior(), "Encodes the reply-to address in the correlation ID.");
        context.Pipeline.Register(b => new BridgeSubscribeBehavior(subscriberAddress, context.Settings.EndpointName(), rampSettings.BridgeAddress, b.Build <IDispatchMessages>(), rampSettings.PublisherTable),
                                  "Dispatches the subscribe request to the bridge.");
        context.Pipeline.Register(b => new BridgeUnsubscribeBehavior(subscriberAddress, context.Settings.EndpointName(), rampSettings.BridgeAddress, b.Build <IDispatchMessages>(), rampSettings.PublisherTable),
                                  "Dispatches the unsubscribe request to the bridge.");
    }
    protected override void Setup(FeatureConfigurationContext context)
    {
        var transportInfra    = context.Settings.Get <TransportInfrastructure>();
        var nativePubSub      = transportInfra.OutboundRoutingPolicy.Publishes == OutboundRoutingType.Multicast;
        var settings          = context.Settings.Get <RouterConnectionSettings>();
        var unicastRouteTable = context.Settings.Get <UnicastRoutingTable>();
        var route             = UnicastRoute.CreateFromEndpointName(settings.RouterAddress);
        var publishers        = context.Settings.Get <Publishers>();
        var bindings          = context.Settings.Get <QueueBindings>();

        //Make sure router queue does exist.
        bindings.BindSending(settings.RouterAddress);

        //Send the specified messages through the router
        var routes = settings.SendRouteTable.Select(x => new RouteTableEntry(x.Key, route)).ToList();

        unicastRouteTable.AddOrReplaceRoutes("NServiceBus.Router", routes);

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

        var publisherAddress = PublisherAddress.CreateFromPhysicalAddresses(settings.RouterAddress);

        publishers.AddOrReplacePublishers("NServiceBus.Router", settings.PublisherTable.Select(kvp => new PublisherTableEntry(kvp.Key, publisherAddress)).ToList());

        context.Pipeline.Register(new ForwardSiteMessagesToRouterBehavior(settings.RouterAddress), "Routes messages sent to sites to the bridge.");
        context.Pipeline.Register(new RoutingHeadersBehavior(settings.SendRouteTable), "Sets the ultimate destination endpoint on the outgoing messages.");
        context.Pipeline.Register(b => new RouterSubscribeBehavior(subscriberAddress, context.Settings.EndpointName(), settings.RouterAddress, b.Build <IDispatchMessages>(), settings.PublisherTable, nativePubSub),
                                  "Dispatches the subscribe request via a router.");
        context.Pipeline.Register(b => new RouterUnsubscribeBehavior(subscriberAddress, context.Settings.EndpointName(), settings.RouterAddress, b.Build <IDispatchMessages>(), settings.PublisherTable, nativePubSub),
                                  "Dispatches the unsubscribe request via a router.");
    }
        public void When_multiple_dynamic_instances_for_local_endpoint_and_instance_selected_should_not_round_robin()
        {
            var routingTable = new UnicastRoutingTable();

            routingTable.AddOrReplaceRoutes("A", new List <RouteTableEntry>
            {
                new RouteTableEntry(typeof(MyMessage), UnicastRoute.CreateFromEndpointName("Endpoint"))
            });

            var endpointInstances = new EndpointInstances();

            endpointInstances.AddOrReplaceInstances("A", new List <EndpointInstance>
            {
                new EndpointInstance("Endpoint", "1"),
                new EndpointInstance("Endpoint", "2"),
            });

            var options = new SendOptions();

            options.RouteToSpecificInstance("2");

            var context = CreateContext(options, new MyMessage());

            var router = CreateRouter(routingTable: routingTable, instances: endpointInstances);
            var route1 = router.Route(context);
            var route2 = router.Route(context);
            var route3 = router.Route(context);

            Assert.AreEqual("Endpoint-2", ExtractDestination(route1));
            Assert.AreEqual("Endpoint-2", ExtractDestination(route2));
            Assert.AreEqual("Endpoint-2", ExtractDestination(route3));
        }
        public void When_multiple_dynamic_instances_for_logical_endpoints_should_round_robin()
        {
            var sales        = "Sales";
            var routingTable = new UnicastRoutingTable();

            routingTable.AddOrReplaceRoutes("A", new List <RouteTableEntry>
            {
                new RouteTableEntry(typeof(MyMessage), UnicastRoute.CreateFromEndpointName(sales))
            });

            var endpointInstances = new EndpointInstances();

            endpointInstances.AddOrReplaceInstances("A", new List <EndpointInstance>
            {
                new EndpointInstance(sales, "1"),
                new EndpointInstance(sales, "2"),
            });

            var context = CreateContext(new SendOptions(), new MyMessage());

            var router = CreateRouter(routingTable: routingTable, instances: endpointInstances);
            var route1 = router.Route(context);
            var route2 = router.Route(context);
            var route3 = router.Route(context);

            Assert.AreEqual("Sales-1", ExtractDestination(route1));
            Assert.AreEqual("Sales-2", ExtractDestination(route2));
            Assert.AreEqual("Sales-1", ExtractDestination(route3));
        }
Пример #7
0
 UnicastRoute RouteToThisInstance()
 {
     if (instanceSpecificQueue == null)
     {
         throw new InvalidOperationException("Cannot route to a specific instance because an endpoint instance discriminator was not configured for the destination endpoint. It can be specified via EndpointConfiguration.MakeInstanceUniquelyAddressable(string discriminator).");
     }
     return(UnicastRoute.CreateFromPhysicalAddress(instanceSpecificQueue));
 }
        UnicastRoute RouteToAnyInstance()
        {
            if (isSendOnly)
            {
                throw new InvalidOperationException("Cannot route to instances of this endpoint since it's configured to be in send-only mode.");
            }

            return(UnicastRoute.CreateFromEndpointName(receiveQueueName));
        }
Пример #9
0
        UnicastRoute RouteToSpecificInstance(IOutgoingSendContext context, string specificInstance)
        {
            var route = RouteUsingTable(context);

            if (route.Endpoint == null)
            {
                throw new Exception("Routing to a specific instance is only allowed if route is defined for a logical endpoint, not for an address or instance.");
            }
            return(UnicastRoute.CreateFromEndpointInstance(new EndpointInstance(route.Endpoint, specificInstance)));
        }
        static void RegisterMessageRoute(Type mappedType, string address, Dictionary <Type, RouteTableEntry> routeTableEntries, IEnumerable <Type> baseTypes)
        {
            var route = UnicastRoute.CreateFromPhysicalAddress(address);

            foreach (var baseType in baseTypes)
            {
                routeTableEntries[baseType] = new RouteTableEntry(baseType, route);
            }
            routeTableEntries[mappedType] = new RouteTableEntry(mappedType, route);
        }
    public static void ForwardToEndpoint(this RoutingSettings routing, Type messageTypeToForward, string destinationEndpointName)
    {
        var settings = routing.GetSettings();

        var endpointRoute = UnicastRoute.CreateFromEndpointName(destinationEndpointName);

        settings.GetOrCreate <ForwardingAddressDirectory>()
        .ForwardToRoute(messageTypeToForward, endpointRoute);

        settings.EnableFeatureByDefault <LeaveForwardingAddressFeature>();
    }
Пример #12
0
        public void When_routing_command_to_logical_endpoint_without_configured_instances_should_route_to_a_single_destination()
        {
            var logicalEndpointName = "Sales";

            routingTable.AddOrReplaceRoutes("A", new List <RouteTableEntry> {
                new RouteTableEntry(typeof(Command), UnicastRoute.CreateFromEndpointName(logicalEndpointName))
            });

            var route = router.Route(typeof(Command), new DistributionPolicy());

            Assert.AreEqual(logicalEndpointName, ExtractDestination(route));
        }
Пример #13
0
        public void When_group_does_not_exist_should_add_routes()
        {
            var routingTable = new UnicastRoutingTable();
            var route        = UnicastRoute.CreateFromEndpointName("Endpoint1");

            routingTable.AddOrReplaceRoutes("key", new List <RouteTableEntry>()
            {
                new RouteTableEntry(typeof(Command), route),
            });

            var retrievedRoute = routingTable.GetRouteFor(typeof(Command));

            Assert.AreSame(route, retrievedRoute);
        }
        void RouteTableViaConfig(EndpointConfiguration config)
        {
            #region RoutingExtensibility-RouteTableConfig

            var routingTable = config.GetSettings().Get <UnicastRoutingTable>();
            routingTable.AddOrReplaceRoutes("MySource",
                                            new List <RouteTableEntry>
            {
                new RouteTableEntry(typeof(MyCommand),
                                    UnicastRoute.CreateFromEndpointName("MyEndpoint"))
            });

            #endregion
        }
Пример #15
0
    public UnicastRoutingStrategy ResolveRoute(UnicastRoute route, OutgoingLogicalMessage outgoingLogicalMessage, string messageId, Dictionary <string, string> headers, ContextBag contextBag)
    {
        if (route.PhysicalAddress != null)
        {
            return(new UnicastRoutingStrategy(route.PhysicalAddress));
        }
        if (route.Instance != null)
        {
            return(new UnicastRoutingStrategy(transportAddressTranslation(route.Instance)));
        }
        var instances               = endpointInstances.FindInstances(route.Endpoint).Select(e => transportAddressTranslation(e)).ToArray();
        var distributionContext     = new DistributionContext(instances, outgoingLogicalMessage, messageId, headers, transportAddressTranslation, contextBag);
        var selectedInstanceAddress = distributionPolicy.GetDistributionStrategy(route.Endpoint, DistributionStrategyScope.Send).SelectDestination(distributionContext);

        return(new UnicastRoutingStrategy(selectedInstanceAddress));
    }
        public void When_route_with_physical_address_routes_to_physical_address()
        {
            var routingTable = new UnicastRoutingTable();

            routingTable.AddOrReplaceRoutes("A", new List <RouteTableEntry>
            {
                new RouteTableEntry(typeof(MyMessage), UnicastRoute.CreateFromPhysicalAddress("Physical"))
            });

            var context = CreateContext(new SendOptions(), new MyMessage());

            var router = CreateRouter(routingTable: routingTable);
            var route  = router.Route(context);

            Assert.AreEqual("Physical", ExtractDestination(route));
        }
        public void When_route_with_endpoint_instance_routes_to_instance()
        {
            var routingTable = new UnicastRoutingTable();

            routingTable.AddOrReplaceRoutes("A", new List <RouteTableEntry>
            {
                new RouteTableEntry(typeof(MyMessage), UnicastRoute.CreateFromEndpointInstance(new EndpointInstance("Endpoint", "2")))
            });

            var context = CreateContext(new SendOptions(), new MyMessage());

            var router = CreateRouter(routingTable: routingTable);
            var route  = router.Route(context);

            Assert.AreEqual("Endpoint-2", ExtractDestination(route));
        }
            public Sender()
            {
                EndpointSetup <DefaultServer>((c, r) =>
                {
                    var receiverAddress = $"{EndpointNamingConvention(typeof(Receiver))}@{ReceiverSchema}";

                    var transportSettings = c.ConfigureSqlServerTransport();

                    c.GetSettings()
                    .GetOrCreate <UnicastRoutingTable>()
                    .AddOrReplaceRoutes("Custom", new List <RouteTableEntry>
                    {
                        new RouteTableEntry(typeof(Message), UnicastRoute.CreateFromPhysicalAddress(receiverAddress))
                    });
                });
            }
Пример #19
0
        UnicastRoutingStrategy ResolveRoute(UnicastRoute route, IOutgoingSendContext context)
        {
            if (route.PhysicalAddress != null)
            {
                return(new UnicastRoutingStrategy(route.PhysicalAddress));
            }
            if (route.Instance != null)
            {
                return(new UnicastRoutingStrategy(transportAddressTranslation(route.Instance)));
            }
            var instances               = endpointInstances.FindInstances(route.Endpoint).Select(e => transportAddressTranslation(e)).ToArray();
            var distributionContext     = new DistributionContext(instances, context.Message, context.MessageId, context.Headers, transportAddressTranslation, context.Extensions);
            var selectedInstanceAddress = defaultDistributionPolicy.GetDistributionStrategy(route.Endpoint, DistributionStrategyScope.Send).SelectDestination(distributionContext);

            return(new UnicastRoutingStrategy(selectedInstanceAddress));
        }
    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.");
        }
    }
        protected override void Setup(FeatureConfigurationContext context)
        {
            var coreScannerConfig   = context.Settings.Get <AssemblyScannerConfiguration>();
            var unicastRoutingTable = context.Settings.Get <UnicastRoutingTable>();
            var conventions         = context.Settings.Get <Conventions>();

            var messageTypes = TypesScanner.ScanMessageTypes(coreScannerConfig, conventions);

            var routes = new List <RouteTableEntry>();

            foreach (var messageType in messageTypes)
            {
                if (IsRouteDefinedFor(messageType, unicastRoutingTable))
                {
                    continue;
                }

                var routeToAttribute = messageType.GetCustomAttribute <RouteToAttribute>();
                if (routeToAttribute != null)
                {
                    routes.Add(new RouteTableEntry(messageType,
                                                   UnicastRoute.CreateFromEndpointName(routeToAttribute.Destination)));
                }
                else
                {
                    var routeAttribute = messageType.Assembly.GetCustomAttribute <RouteAttribute>();
                    if (conventions.IsCommandType(messageType) &&
                        routeAttribute?.CommandsDestination != null)
                    {
                        routes.Add(new RouteTableEntry(messageType,
                                                       UnicastRoute.CreateFromEndpointName(routeAttribute.CommandsDestination)));
                    }
                    else if (conventions.IsMessageType(messageType) &&
                             routeAttribute?.MessagesDestination != null)
                    {
                        routes.Add(new RouteTableEntry(messageType,
                                                       UnicastRoute.CreateFromEndpointName(routeAttribute.MessagesDestination)));
                    }
                }
            }

            if (routes.Any())
            {
                unicastRoutingTable.AddOrReplaceRoutes("AttributeRoutingSource", routes);
            }
        }
        public void When_routing_command_to_logical_endpoint_without_configured_instances_should_route_to_a_single_destination()
        {
            var logicalEndpointName = "Sales";
            var routingTable        = new UnicastRoutingTable();

            routingTable.AddOrReplaceRoutes("A", new List <RouteTableEntry>
            {
                new RouteTableEntry(typeof(MyMessage), UnicastRoute.CreateFromEndpointName(logicalEndpointName))
            });

            var context = CreateContext(new SendOptions(), new MyMessage());

            var router = CreateRouter(routingTable: routingTable);
            var route  = router.Route(context);

            Assert.AreEqual(logicalEndpointName, ExtractDestination(route));
        }
Пример #23
0
        public void When_multiple_dynamic_instances_for_logical_endpoints_should_route_message_to_a_single_instance()
        {
            var sales = "Sales";

            routingTable.AddOrReplaceRoutes("A", new List <RouteTableEntry> {
                new RouteTableEntry(typeof(Command), UnicastRoute.CreateFromEndpointName(sales))
            });

            endpointInstances.AddOrReplaceInstances("A", new List <EndpointInstance>
            {
                new EndpointInstance(sales, "1"),
                new EndpointInstance(sales, "2"),
            });

            var route = router.Route(typeof(Command), new DistributionPolicy());

            Assert.AreEqual("Sales-1", ExtractDestination(route));
        }
Пример #24
0
 public Endpoint()
 {
     EndpointSetup <DefaultServer>(c =>
     {
         c.GetSettings().GetOrCreate <UnicastRoutingTable>()
         .AddOrReplaceRoutes("CustomRoutingFeature", new List <RouteTableEntry>
         {
             new RouteTableEntry(typeof(MyCommand), UnicastRoute.CreateFromEndpointName(ReceiverEndpoint))
         });
         c.GetSettings().GetOrCreate <EndpointInstances>()
         .AddOrReplaceInstances("CustomRoutingFeature", new List <EndpointInstance>
         {
             new EndpointInstance(ReceiverEndpoint, Discriminator2)
         });
         c.GetSettings().GetOrCreate <DistributionPolicy>()
         .SetDistributionStrategy(new SelectFirstDistributionStrategy(ReceiverEndpoint, (Context)ScenarioContext));
     });
 }
Пример #25
0
 IEnumerable <string> ResolveRoute(UnicastRoute route)
 {
     if (route.Instance != null)
     {
         yield return(resolveTransportAddress(route.Instance));
     }
     else if (route.PhysicalAddress != null)
     {
         yield return(route.PhysicalAddress);
     }
     else
     {
         foreach (var instance in endpointInstances.FindInstances(route.Endpoint))
         {
             yield return(resolveTransportAddress(instance));
         }
     }
 }
Пример #26
0
        public void When_routes_are_ambiguous_should_throw_exception()
        {
            var routingTable      = new UnicastRoutingTable();
            var lowPriorityRoute  = UnicastRoute.CreateFromEndpointName("Endpoint1");
            var highPriorityRoute = UnicastRoute.CreateFromEndpointName("Endpoint2");

            routingTable.AddOrReplaceRoutes("key2", new List <RouteTableEntry>()
            {
                new RouteTableEntry(typeof(Command), highPriorityRoute),
            });

            Assert.That(() =>
            {
                routingTable.AddOrReplaceRoutes("key1", new List <RouteTableEntry>()
                {
                    new RouteTableEntry(typeof(Command), lowPriorityRoute),
                });
            }, Throws.Exception);
        }
Пример #27
0
        public void Setup(FeatureConfigurationContext context)
        {
            var mainEndpointName        = context.Settings.EndpointName();
            var routerEndpointName      = $"{mainEndpointName}_Migrator";
            var settings                = context.Settings.Get <MigratorSettings>();
            var unicastRouteTable       = context.Settings.Get <UnicastRoutingTable>();
            var distributionPolicy      = context.Settings.Get <DistributionPolicy>();
            var transportInfrastructure = context.Settings.Get <TransportInfrastructure>();
            var queueBindings           = context.Settings.Get <QueueBindings>();

            var customizeOldTransport = context.Settings.Get <Action <TransportExtensions <TOld> > >(MigratorConfigurationExtensions.OldTransportCustomizationSettingsKey);
            var customizeNewTransport = context.Settings.Get <Action <TransportExtensions <TNew> > >(MigratorConfigurationExtensions.NewTransportCustomizationSettingsKey);

            var routerAddress = transportInfrastructure.ToTransportAddress(LogicalAddress.CreateRemoteAddress(new EndpointInstance(routerEndpointName)));

            queueBindings.BindSending(routerAddress);


            //context.RegisterStartupTask(b => new RoutingMonitor(unicastRouteTable, settings.SendRouteTable, route, b.Build<CriticalError>()));

            var route  = UnicastRoute.CreateFromPhysicalAddress(routerAddress);
            var routes = settings.SendRouteTable.Select(x => new RouteTableEntry(x.Key, route)).ToList();

            unicastRouteTable.AddOrReplaceRoutes("NServiceBus.Router.Migrator", routes);

            context.Pipeline.Register(new MigratorRouterDestinationBehavior(settings.SendRouteTable),
                                      "Sets the ultimate destination endpoint on the outgoing messages.");

            context.Pipeline.Replace("MigrationModePublishConnector", b => new DualRoutingPublishConnector(routerAddress, distributionPolicy, b.Build <MessageMetadataRegistry>(), i => transportInfrastructure.ToTransportAddress(LogicalAddress.CreateRemoteAddress(i)), b.Build <ISubscriptionStorage>()),
                                     "Routes published messages via router and publishes them natively");

            context.Pipeline.Register(b => new UnsubscribeAfterMigrationBehavior(b.BuildAll <ISubscriptionStorage>().FirstOrDefault()),
                                      "Removes old transport subscriptions when a new transport subscription for the same event and endpoint comes in");

            context.Pipeline.Register(new DualRoutingFilterBehavior(mainEndpointName), "Ignores duplicates when publishing both natively and message-driven");

            context.Pipeline.Register(b => new MigratorRouterSubscribeBehavior(context.Settings.LocalAddress(), context.Settings.EndpointName(), routerAddress, b.Build <IDispatchMessages>(), settings.PublisherTable),
                                      "Dispatches the subscribe request via a router.");

            var routerConfig = PrepareRouterConfiguration(routerEndpointName, mainEndpointName, context.Settings.LocalAddress(), customizeOldTransport, customizeNewTransport);

            context.RegisterStartupTask(new MigratorStartupTask(routerConfig));
        }
 public Sender()
 {
     EndpointSetup <DefaultServer>(c =>
     {
         c.GetSettings().GetOrCreate <UnicastRoutingTable>()
         .AddOrReplaceRoutes("CustomRoutingFeature", new List <RouteTableEntry>
         {
             new RouteTableEntry(typeof(MyCommand), UnicastRoute.CreateFromEndpointName(ReceiverEndpoint))
         });
         c.GetSettings().GetOrCreate <EndpointInstances>()
         .AddOrReplaceInstances("CustomRoutingFeature", new List <EndpointInstance>
         {
             new EndpointInstance(ReceiverEndpoint, "XYZ"),
             new EndpointInstance(ReceiverEndpoint, "ABC")
         });
         c.GetSettings().GetOrCreate <DistributionPolicy>()
         .SetDistributionStrategy(new XyzDistributionStrategy(ReceiverEndpoint));
     });
 }
        public void When_routing_to_specific_instance_should_throw_when_route_for_given_type_points_to_physical_address()
        {
            var table = new UnicastRoutingTable();

            table.AddOrReplaceRoutes("A", new List <RouteTableEntry>
            {
                new RouteTableEntry(typeof(MyMessage), UnicastRoute.CreateFromPhysicalAddress("PhysicalAddress"))
            });
            var router  = CreateRouter(routingTable: table);
            var options = new SendOptions();

            options.RouteToSpecificInstance("instanceId");

            var context = CreateContext(options);

            var exception = Assert.Throws <Exception>(() => router.Route(context));

            StringAssert.Contains("Routing to a specific instance is only allowed if route is defined for a logical endpoint, not for an address or instance.", exception.Message);
        }
Пример #30
0
        static void UpdateRoutingTable(XmlRoutingFileParser routingFileParser, XmlRoutingFileAccess routingFile, UnicastRoutingTable routingTable, UnicastSubscriberTable subscriberTable, bool nativeSends, bool nativePublishes)
        {
            try
            {
                var endpoints = routingFileParser.Parse(routingFile.Read());

                var commandRoutes = new List <RouteTableEntry>();
                var eventRoutes   = new List <RouteTableEntry>();

                foreach (var endpoint in endpoints)
                {
                    var route = UnicastRoute.CreateFromEndpointName(endpoint.LogicalEndpointName);
                    foreach (var commandType in endpoint.Commands)
                    {
                        if (nativeSends)
                        {
                            log.Warn($"Selected transport uses native command routing. Route for {commandType.FullName} to {endpoint.LogicalEndpointName} configured in {routingFile.FileUri} will be ignored.");
                        }
                        commandRoutes.Add(new RouteTableEntry(commandType, route));
                    }

                    foreach (var eventType in endpoint.Events)
                    {
                        if (nativePublishes)
                        {
                            log.Warn($"Selected transport uses native event routing. Route for {eventType.FullName} to {endpoint.LogicalEndpointName} configured in {routingFile.FileUri} will be ignored.");
                        }
                        eventRoutes.Add(new RouteTableEntry(eventType, route));
                    }
                }

                routingTable.AddOrReplaceRoutes("FileBasedRouting", commandRoutes);
                subscriberTable.AddOrReplaceRoutes("FileBasedRouting", eventRoutes);

                log.Debug($"Updated routing information from {routingFile.FileUri}");
            }
            catch (Exception e)
            {
                log.Error($"Failed to update routing information from {routingFile.FileUri}. The last valid routing configuration will be used instead.", e);
                throw;
            }
        }
Пример #31
0
 public TypeRouteSource(Type messageType, UnicastRoute route)
 {
     this.messageType = messageType;
     this.route = route;
 }
Пример #32
0
 public AssemblyRouteSource(Assembly messageAssembly, UnicastRoute route)
 {
     this.messageAssembly = messageAssembly;
     this.route = route;
 }
Пример #33
0
 public NamespaceRouteSource(Assembly messageAssembly, string messageNamespace, UnicastRoute route)
 {
     this.messageAssembly = messageAssembly;
     this.route = route;
     this.messageNamespace = messageNamespace;
 }