/// <summary>
        /// Configures a Turnout on the receive endpoint, which executes a long-running job and supervises the job until it
        /// completes.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="busFactoryConfigurator">The bus factory configuration to use a separate endpoint for the control traffic</param>
        /// <param name="queueName"></param>
        /// <param name="configure"></param>
        /// <param name="host"></param>
        public static void TurnoutEndpoint <T>(this IServiceBusBusFactoryConfigurator busFactoryConfigurator, IServiceBusHost host, string queueName,
                                               Action <ITurnoutServiceConfigurator <T> > configure)
            where T : class
        {
            string expiredQueueName = $"{queueName}-expired";

            // configure the message expiration endpoint, so it's available at startup
            busFactoryConfigurator.ReceiveEndpoint(expiredQueueName, expiredEndpointConfigurator =>
            {
                expiredEndpointConfigurator.SubscribeMessageTopics = false;

                // configure the turnout management endpoint
                busFactoryConfigurator.ReceiveEndpoint(new TurnoutEndpointDefinition(), null, turnoutEndpointConfigurator =>
                {
                    turnoutEndpointConfigurator.PrefetchCount          = 100;
                    turnoutEndpointConfigurator.EnableExpress          = true;
                    turnoutEndpointConfigurator.SubscribeMessageTopics = false;

                    turnoutEndpointConfigurator.EnableDeadLetteringOnMessageExpiration = true;
                    turnoutEndpointConfigurator.ForwardDeadLetteredMessagesTo          = expiredQueueName;

                    turnoutEndpointConfigurator.AutoDeleteOnIdle = Defaults.TemporaryAutoDeleteOnIdle;

                    // configure the input queue endpoint
                    busFactoryConfigurator.ReceiveEndpoint(queueName, commandEndpointConfigurator =>
                    {
                        commandEndpointConfigurator.SubscribeMessageTopics = false;

                        commandEndpointConfigurator.ConfigureTurnoutEndpoints(busFactoryConfigurator, turnoutEndpointConfigurator, expiredEndpointConfigurator,
                                                                              configure);
                    });
                });
            });
        }
Пример #2
0
        /// <summary>
        /// Configures a Turnout on the receive endpoint, which executes a long-running job and supervises the job until it
        /// completes.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="busFactoryConfigurator">The bus factory configuration to use a separate endpoint for the control traffic</param>
        /// <param name="queueName"></param>
        /// <param name="configure"></param>
        /// <param name="host"></param>
        public static void TurnoutEndpoint <T>(this IServiceBusBusFactoryConfigurator busFactoryConfigurator, IServiceBusHost host, string queueName,
                                               Action <ITurnoutServiceConfigurator <T> > configure)
            where T : class
        {
            string expiredQueueName = $"{queueName}-expired";

            // configure the message expiration endpoint, so it's available at startup
            busFactoryConfigurator.ReceiveEndpoint(host, expiredQueueName, expiredEndpointConfigurator =>
            {
                // configure the turnout management endpoint
                var temporaryQueueName = host.GetTemporaryQueueName("turnout-");
                busFactoryConfigurator.ReceiveEndpoint(host, temporaryQueueName, turnoutEndpointConfigurator =>
                {
                    turnoutEndpointConfigurator.PrefetchCount    = 100;
                    turnoutEndpointConfigurator.AutoDeleteOnIdle = TimeSpan.FromMinutes(5);
                    turnoutEndpointConfigurator.EnableExpress    = true;

                    turnoutEndpointConfigurator.EnableDeadLetteringOnMessageExpiration = true;
                    turnoutEndpointConfigurator.ForwardDeadLetteredMessagesTo          = expiredQueueName;

                    // configure the input queue endpoint
                    busFactoryConfigurator.ReceiveEndpoint(host, queueName, commandEndpointConfigurator =>
                    {
                        commandEndpointConfigurator.ConfigureTurnoutEndpoints(busFactoryConfigurator, turnoutEndpointConfigurator, expiredEndpointConfigurator,
                                                                              configure);
                    });
                });
            });
        }
        public static void ConfigureFrameworkWebServices(IServiceBusBusFactoryConfigurator configurator)
        {
            ConfigureHost(configurator);

            configurator.ReceiveEndpoint(Constants.FrameWorkQueue, e =>
            {
                e.Consumer <FrameworkStringIntConsumer>();
            });

            configurator.ReceiveEndpoint(Constants.FrameWorkRpcQueue, e =>
            {
                e.Consumer <FrameworkStringIntRpcConsumer>();
            });
        }
Пример #4
0
 protected override void ConfigureBusHost(IServiceBusBusFactoryConfigurator configurator, IServiceBusHost host)
 {
     configurator.ReceiveEndpoint(host, "input_queue_error", x =>
     {
         _errorHandler = Handled<PingMessage>(x);
     });
 }
Пример #5
0
 public static void ReceiveEndpoint(this IServiceBusBusFactoryConfigurator @this, IServiceBusHost host,
                                    ServiceContext serviceContext,
                                    ServicePartitionInformation partitionInformation,
                                    Action <IServiceBusReceiveEndpointConfigurator> configureEndpoint)
 {
     @this.ReceiveEndpoint(host, UniqueQueueName(serviceContext, partitionInformation), configureEndpoint);
 }
Пример #6
0
 protected override void ConfigureServiceBusBus(IServiceBusBusFactoryConfigurator configurator)
 {
     configurator.ReceiveEndpoint("test_endpoint_scope/input_queue", e =>
     {
         _handler = Handled <PingMessage>(e);
     });
 }
Пример #7
0
 protected override void ConfigureServiceBusBusHost(IServiceBusBusFactoryConfigurator configurator, IServiceBusHost host)
 {
     configurator.ReceiveEndpoint(host, "input_queue_error", x =>
     {
         _errorHandler = Handled <PingMessage>(x);
     });
 }
Пример #8
0
        protected override void ConfigureServiceBusBusHost(IServiceBusBusFactoryConfigurator configurator, IServiceBusHost host)
        {
            configurator.UseServiceBusMessageScheduler();

            base.ConfigureServiceBusBusHost(configurator, host);

            configurator.TurnoutEndpoint <LongTimeJob>(host, "service_queue", endpoint =>
            {
                endpoint.SuperviseInterval = TimeSpan.FromSeconds(1);
                endpoint.SetJobFactory(async context =>
                {
                    Console.WriteLine("Starting job: {0}", context.Command.Id);

                    await Task.Delay(context.Command.Duration).ConfigureAwait(false);

                    Console.WriteLine("Finished job: {0}", context.Command.Id);
                });

                _serviceAddress = endpoint.InputAddress;
            });

            _stateMachine = new TurnoutJobStateMachine();
            _repository   = new MessageSessionSagaRepository <TurnoutJobState>();


            configurator.ReceiveEndpoint(host, "service_state", endpoint =>
            {
                endpoint.RequiresSession    = true;
                endpoint.MessageWaitTimeout = TimeSpan.FromHours(8);

                endpoint.StateMachineSaga(_stateMachine, _repository);
            });
        }
Пример #9
0
 protected override void ConfigureServiceBusBus(IServiceBusBusFactoryConfigurator configurator)
 {
     configurator.ReceiveEndpoint("input-fault", endpointConfigurator =>
     {
         _faulted = Handled <Fault <TestCommand> >(endpointConfigurator);
     });
 }
        public void Build(IServiceBusHost host, IServiceBusBusFactoryConfigurator configurator)
        {
            addressProvider.Register("error");

            var consumerTypes = GetConsumerTypes();
            var messageTypes  = GetMessageTypes();

            foreach (var messageType in messageTypes)
            {
                addressProvider.Register(messageType);
                var messageConsumerTypes = GetConsumerTypes(messageType, consumerTypes);

                if (messageConsumerTypes.Any())
                {
                    foreach (var consumerType in messageConsumerTypes)
                    {
                        RegisterConsumerType(consumerType);

                        var queueName           = addressProvider.GetQueueName(messageType);
                        var receiveConfigurator = GetReceiveEndpointConfigurator(messageType, consumerType);

                        configurator.ReceiveEndpoint(host, queueName, receiveConfigurator);
                    }
                }
            }
        }
Пример #11
0
 protected override void ConfigureServiceBusBus(IServiceBusBusFactoryConfigurator configurator)
 {
     configurator.ReceiveEndpoint(e =>
     {
         e.RemoveSubscriptions = true;
         _consumer             = HandledByConsumer <PingMessage>(e);
     });
 }
Пример #12
0
        protected override void ConfigureServiceBusBus(IServiceBusBusFactoryConfigurator configurator)
        {
            configurator.ReceiveEndpoint("input_queue_error", x =>
            {
                x.ConfigureConsumeTopology = false;

                _errorHandler = Handled <PingMessage>(x);
            });
        }
Пример #13
0
 protected override void ConfigureServiceBusBusHost(IServiceBusBusFactoryConfigurator configurator, IServiceBusHost host)
 {
     base.ConfigureServiceBusBusHost(configurator, host);
     configurator.ReceiveEndpoint(host, e =>
     {
         e.RemoveSubscriptions = true;
         _consumer             = HandledByConsumer <PingMessage>(e);
     });
 }
Пример #14
0
        protected override void ConfigureServiceBusBus(IServiceBusBusFactoryConfigurator configurator)
        {
            configurator.ReceiveEndpoint("input_queue_dl", x =>
            {
                x.ConfigureConsumeTopology = false;

                x.ConfigureDeadLetterQueueDeadLetterTransport();
            });
        }
        public void ReceiveEndpoint(string queueName, int consumerLimit, Action <IReceiveEndpointConfigurator> configureEndpoint)
        {
            _configurator.ReceiveEndpoint(_host, queueName, x =>
            {
                x.PrefetchCount = (ushort)consumerLimit;

                configureEndpoint(x);
            });
        }
Пример #16
0
        /// <inheritdoc />
        public override void SetEndpoint(IServiceBusBusFactoryConfigurator busCfg, IServiceBusHost host)
        => busCfg.ReceiveEndpoint(host, Name, endpointConfig =>
        {
            _configurator?.Invoke(endpointConfig);

            foreach (Action <IServiceBusReceiveEndpointConfigurator> consumerConfig in _consumers)
            {
                consumerConfig?.Invoke(endpointConfig);
            }
        });
Пример #17
0
        protected override void ConfigureServiceBusBus(IServiceBusBusFactoryConfigurator configurator)
        {
            configurator.ReceiveEndpoint("input_queue_dl", x =>
            {
                x.ConfigureConsumeTopology = false;

                x.ConfigureDeadLetterQueueErrorTransport();

                x.Handler <PongMessage>(async context => throw new IntentionalTestException());
            });
        }
        public static void ConfigureCoreWebServices(IServiceBusBusFactoryConfigurator configurator,
                                                    IBusRegistrationContext context)
        {
            ConfigureHost(configurator);

            configurator.ReceiveEndpoint(Constants.CoreRpcQueue, e =>
            {
                e.ConfigureConsumer <CoreStringIntRpcConsumer>(context);
            });

            configurator.ReceiveEndpoint(Constants.CoreWorkQueue, e =>
            {
                e.ConfigureConsumer <CoreStringIntConsumer>(context);
            });

            configurator.ReceiveEndpoint("CoreCorrelationStart", e =>
            {
                e.ConfigureConsumer <CorrelationStartConsumer>(context);
            });
        }
 void ConfigureExecuteActivity <TActivity, TArguments>(IServiceBusBusFactoryConfigurator cfg, IServiceBusHost host)
     where TActivity : class, ExecuteActivity <TArguments>, new()
     where TArguments : class
 {
     cfg.ReceiveEndpoint(host, GetExecuteActivityQueueName(typeof(TActivity)), e =>
     {
         e.PrefetchCount          = 16;
         e.SubscribeMessageTopics = false;
         e.ExecuteActivityHost <TActivity, TArguments>();
     });
 }
 private void ConfigureBusEndpoints(IServiceBusBusFactoryConfigurator factoryConfigurator)
 {
     foreach (var consumerType in ConsumerTypes)
     {
         SetNames(consumerType, out var queueName, out var topicName, out var subscriptionName);
         factoryConfigurator.ReceiveEndpoint(queueName, endpointConfigurator =>
         {
             endpointConfigurator.Subscribe(topicName, subscriptionName);
             endpointConfigurator.ConfigureConsumer(_serviceProvider, consumerType);
         });
     }
 }
        /// <summary>
        /// Declare a ReceiveEndpoint using a unique generated queue name. This queue defaults to auto-delete
        /// and non-durable. By default all services bus instances include a default receiveEndpoint that is
        /// of this type (created automatically upon the first receiver binding).
        /// </summary>
        /// <param name="configurator"></param>
        /// <param name="host"></param>
        /// <param name="configure"></param>
        public static void ReceiveEndpoint(this IServiceBusBusFactoryConfigurator configurator, IServiceBusHost host,
                                           Action <IServiceBusReceiveEndpointConfigurator> configure)
        {
            var queueName = host.Topology.CreateTemporaryQueueName("endpoint");

            configurator.ReceiveEndpoint(host, queueName, x =>
            {
                x.AutoDeleteOnIdle = Defaults.TemporaryAutoDeleteOnIdle;

                configure(x);
            });
        }
Пример #22
0
        protected override void ConfigureBusHost(IServiceBusBusFactoryConfigurator configurator, IServiceBusHost host)
        {
            base.ConfigureBusHost(configurator, host);

            configurator.ReceiveEndpoint(host, "input_express", x =>
            {
                x.EnableExpress = true;
                x.AutoDeleteOnIdle = TimeSpan.FromMinutes(5);

                _handled = Handled<PingMessage>(x);
            });
        }
Пример #23
0
        protected override void ConfigureBusHost(IServiceBusBusFactoryConfigurator configurator, IServiceBusHost host)
        {
            base.ConfigureBusHost(configurator, host);

            configurator.ReceiveEndpoint(host, "input_express", x =>
            {
                x.EnableExpress    = true;
                x.AutoDeleteOnIdle = TimeSpan.FromMinutes(5);

                _handled = Handled <PingMessage>(x);
            });
        }
        /// <summary>
        /// Declare a ReceiveEndpoint using a unique generated queue name. This queue defaults to auto-delete
        /// and non-durable. By default all services bus instances include a default receiveEndpoint that is
        /// of this type (created automatically upon the first receiver binding).
        /// </summary>
        /// <param name="configurator"></param>
        /// <param name="host"></param>
        /// <param name="configure"></param>
        public static void ReceiveEndpoint(this IServiceBusBusFactoryConfigurator configurator, IServiceBusHost host,
                                           Action <IServiceBusReceiveEndpointConfigurator> configure)
        {
            var queueName = host.GetTemporaryQueueName("endpoint");

            configurator.ReceiveEndpoint(host, queueName, x =>
            {
                x.AutoDeleteOnIdle = TimeSpan.FromMinutes(5);
                x.EnableExpress    = true;

                configure(x);
            });
        }
Пример #25
0
        /// <inheritdoc />
        public override void SetEndpoint(IServiceBusBusFactoryConfigurator busCfg)
        => busCfg.ReceiveEndpoint(Name, endpointConfig =>
        {
            SetDefaults(endpointConfig);
            endpointConfig.DuplicateDetectionHistoryTimeWindow = ConfigDefaults.DuplicateDetectionWindow;

            _configurator?.Invoke(endpointConfig);

            foreach (Action <IServiceBusReceiveEndpointConfigurator> consumerConfig in _consumers)
            {
                consumerConfig?.Invoke(endpointConfig);
            }
        });
Пример #26
0
        /// <summary>
        /// Configures a Turnout on the receive endpoint, which executes a long-running job and supervises the job until it
        /// completes.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="configurator">The receive endpoint configurator</param>
        /// <param name="busFactoryConfigurator">The bus factory configuration to use a separate endpoint for the control traffic</param>
        /// <param name="configure"></param>
        public static void Turnout <T>(this IServiceBusReceiveEndpointConfigurator configurator, IServiceBusBusFactoryConfigurator busFactoryConfigurator,
                                       Action <ITurnoutHostConfigurator <T> > configure)
            where T : class
        {
            var temporaryQueueName = busFactoryConfigurator.GetTemporaryQueueName("turnout-");

            busFactoryConfigurator.ReceiveEndpoint(configurator.Host, temporaryQueueName, turnoutEndpointConfigurator =>
            {
                turnoutEndpointConfigurator.AutoDeleteOnIdle = TimeSpan.FromMinutes(5);
                turnoutEndpointConfigurator.EnableExpress    = true;

                configurator.ConfigureTurnoutEndpoints(busFactoryConfigurator, turnoutEndpointConfigurator, configure);
            });
        }
        void ConfigureActivity <TActivity, TArguments, TLog>(IServiceBusBusFactoryConfigurator cfg, IServiceBusHost host)
            where TActivity : class, Activity <TArguments, TLog>, new()
            where TArguments : class
            where TLog : class
        {
            Uri compensateAddress = null;

            cfg.ReceiveEndpoint(host, GetCompensateActivityQueueName(typeof(TActivity)), e =>
            {
                e.PrefetchCount          = 16;
                e.SubscribeMessageTopics = false;
                e.CompensateActivityHost <TActivity, TLog>();

                compensateAddress = e.InputAddress;
            });

            cfg.ReceiveEndpoint(host, GetExecuteActivityQueueName(typeof(TActivity)), e =>
            {
                e.PrefetchCount          = 16;
                e.SubscribeMessageTopics = false;
                e.ExecuteActivityHost <TActivity, TArguments>(compensateAddress);
            });
        }
Пример #28
0
        protected override void ConfigureServiceBusBus(IServiceBusBusFactoryConfigurator configurator)
        {
            configurator.ReceiveEndpoint("order-observer", e =>
            {
                e.Consumer <OrderSubmittedConsumer>();
            });

            configurator.ReceiveEndpoint("order-state", e =>
            {
                _machine    = new OrderStateMachine();
                _repository = new InMemorySagaRepository <OrderState>();

                e.StateMachineSaga(_machine, _repository);

                EndpointConvention.Map <OrderProcessed>(e.InputAddress);
            });

            configurator.ReceiveEndpoint("execute-process-order", e =>
            {
                e.ExecuteActivityHost <ProcessOrderActivity, ProcessOrderArguments>();

                EndpointConvention.Map <ProcessOrderArguments>(e.InputAddress);
            });
        }
        /// <summary>
        /// Configure a service instance, which supports one or more receive endpoints, all of which are managed by conductor.
        /// </summary>
        /// <param name="configurator"></param>
        /// <param name="configure"></param>
        public static void ServiceInstance(this IServiceBusBusFactoryConfigurator configurator,
                                           Action <IServiceInstanceConfigurator <IServiceBusReceiveEndpointConfigurator> > configure)
        {
            var instanceId           = NewId.Next();
            var instanceEndpointName = ServiceEndpointNameFormatter.Instance.EndpointName(instanceId);

            configurator.ReceiveEndpoint(instanceEndpointName, endpointConfigurator =>
            {
                var instance = new ServiceInstance(instanceId, endpointConfigurator);

                var instanceConfigurator = new ServiceBusServiceInstanceConfigurator(configurator, instance);

                instanceConfigurator.ConfigureInstanceEndpoint(endpointConfigurator);

                configure?.Invoke(instanceConfigurator);
            });
        }
Пример #30
0
        /// <summary>
        /// Creates a management endpoint which can be used by controllable filters on a bus intance
        /// </summary>
        /// <param name="configurator"></param>
        /// <param name="host">The service bus host</param>
        /// <param name="configure"></param>
        /// <returns></returns>
        public static IManagementEndpointConfigurator ManagementEndpoint(this IServiceBusBusFactoryConfigurator configurator,
                                                                         IServiceBusHost host, Action <IReceiveEndpointConfigurator> configure = null)
        {
            var queueName = host.Topology.CreateTemporaryQueueName("manage-");

            IServiceBusReceiveEndpointConfigurator specification = null;

            configurator.ReceiveEndpoint(host, queueName, x =>
            {
                x.AutoDeleteOnIdle = Defaults.TemporaryAutoDeleteOnIdle;

                configure?.Invoke(x);

                specification = x;
            });

            return(new ManagementEndpointConfigurator(specification));
        }
Пример #31
0
        static void ConfigureBusEndpoints(IServiceBusBusFactoryConfigurator cfg, IServiceProvider provider, IServiceBusHost host)
        {
            const string subsriberName = "AnotherSubscriber";

            cfg.SubscriptionEndpoint <AnotherThingHappened>(host, subsriberName, configurator =>
            {
                configurator.Handler <AnotherThingHappened>(context =>
                {
                    Console.WriteLine(context.Message.AnotherThingType);
                    if (Random.NextDouble() < 0.1)
                    {
                        throw new Exception("Oups, I failed :(");
                    }
                    return(Task.CompletedTask);
                });
            });

            cfg.SubscriptionEndpoint <ObjectCreatedA>(host, subsriberName, configurator =>
            {
                configurator.Consumer <ObjectACreatedEventHandler>();
            });

            cfg.ReceiveEndpoint(host, queueName: "AnotherSubscirber2", configure: configurator =>
            {
                configurator.Handler <ObjectCreatedB>(async context =>
                {
                    Console.WriteLine("Another subscirber, object b created");
                    await context.SchedulePublish <ScheduledCommand>(TimeSpan.FromSeconds(30), new ScheduledCommandImpl
                    {
                        ExecutedIn = 30, IsReallyScheduled = true
                    });

                    ChangeCaseCommand changeCase = new ChangeCaseCommandImpl
                    {
                        IsScheduled = true,
                        Text        = "Hello world"
                    };

                    await context.ScheduleSendConventional(TimeSpan.FromSeconds(15), changeCase);
                });
            });

            cfg.CreateConventionalCommandHandlerEndpoint <DoAnotherThingCommandHandler, DoAnotherThingCommand>(provider);
        }
Пример #32
0
        protected override void ConfigureServiceBusBusHost(IServiceBusBusFactoryConfigurator configurator, IServiceBusHost host)
        {
            configurator.Send <PartitionedMessage>(x =>
            {
                x.UsePartitionKeyFormatter(p => p.Message.CorrelationId.ToString("N"));
            });

            configurator.Publish <PartitionedMessage>(x =>
            {
                x.EnablePartitioning = true;
            });

            configurator.ReceiveEndpoint(host, "partitioned-input-queue", x =>
            {
                x.EnablePartitioning = true;

                _otherHandled = Handled <PartitionedMessage>(x);
            });
        }