Example #1
0
        /// <summary>
        /// Connect a consumer with a consumer type and object factory method for the consumer
        /// </summary>
        /// <param name="connector"></param>
        /// <param name="consumerType"></param>
        /// <param name="objectFactory"></param>
        /// <returns></returns>
        public static ConnectHandle ConnectConsumer(this IConsumePipeConnector connector, Type consumerType, Func <Type, object> objectFactory)
        {
            if (connector == null)
            {
                throw new ArgumentNullException(nameof(connector));
            }
            if (consumerType == null)
            {
                throw new ArgumentNullException(nameof(consumerType));
            }
            if (objectFactory == null)
            {
                throw new ArgumentNullException(nameof(objectFactory));
            }
            if (!consumerType.HasInterface <IConsumer>())
            {
                throw new ArgumentException("The consumer type must implement an IConsumer interface");
            }

            if (_log.IsDebugEnabled)
            {
                _log.DebugFormat("Subscribing Consumer: {0} (by type, using object consumer factory)", consumerType);
            }

            return(ConsumerConnectorCache.Connect(connector, consumerType, objectFactory));
        }
        public ConnectHandle ConnectSaga <T>(IConsumePipeConnector consumePipe, ISagaRepository <T> sagaRepository, ISagaSpecification <T> specification)
            where T : class, ISaga
        {
            var handles = new List <ConnectHandle>();

            try
            {
                foreach (ISagaMessageConnector <T> connector in _connectors.Cast <ISagaMessageConnector <T> >())
                {
                    var handle = connector.ConnectSaga(consumePipe, sagaRepository, specification);

                    handles.Add(handle);
                }

                return(new MultipleConnectHandle(handles));
            }
            catch (Exception)
            {
                foreach (var handle in handles)
                {
                    handle.Dispose();
                }

                throw;
            }
        }
Example #3
0
            public SetPrefetchCountConsumer(IConsumePipeConnector managementPipe, ModelContext modelContext, ISetPrefetchCount filter)
            {
                _modelContext = modelContext;
                _filter       = filter;

                _handle = managementPipe.ConnectInstance(this);
            }
Example #4
0
        /// <summary>
        /// Connects any consumers for the object to the message dispatcher
        /// </summary>
        /// <typeparam name="T">The consumer type</typeparam>
        /// <param name="bus">The service bus instance to call this method on.</param>
        /// <param name="instance">The instance to subscribe.</param>
        /// <returns>The unsubscribe action that can be called to unsubscribe the instance
        /// passed as an argument.</returns>
        public static ConnectHandle ConnectInstance <T>(this IConsumePipeConnector bus, T instance)
            where T : class, IConsumer
        {
            var connector = InstanceConnectorCache.GetInstanceConnector <T>();

            return(connector.ConnectInstance(bus, instance));
        }
Example #5
0
        /// <summary>
        /// Connects the saga to the bus
        /// </summary>
        /// <typeparam name="T">The saga type</typeparam>
        /// <param name="bus">The bus to which the saga is to be connected</param>
        /// <param name="sagaRepository">The saga repository</param>
        /// <param name="pipeSpecifications"></param>
        public static ConnectHandle ConnectSaga <T>(this IConsumePipeConnector bus, ISagaRepository <T> sagaRepository,
                                                    params IPipeSpecification <SagaConsumeContext <T> >[] pipeSpecifications)
            where T : class, ISaga
        {
            if (bus == null)
            {
                throw new ArgumentNullException(nameof(bus));
            }
            if (sagaRepository == null)
            {
                throw new ArgumentNullException(nameof(sagaRepository));
            }

            if (_log.IsDebugEnabled)
            {
                _log.DebugFormat("Subscribing Saga: {0}", TypeMetadataCache <T> .ShortName);
            }

            ISagaSpecification <T> specification = SagaConnectorCache <T> .Connector.CreateSagaSpecification <T>();

            foreach (IPipeSpecification <SagaConsumeContext <T> > pipeSpecification in pipeSpecifications)
            {
                specification.AddPipeSpecification(pipeSpecification);
            }

            return(SagaConnectorCache <T> .Connector.ConnectSaga(bus, sagaRepository, specification));
        }
        public ConnectHandle ConnectConsumer(IConsumePipeConnector consumePipe, IConsumerFactory <TConsumer> consumerFactory,
                                             IConsumerSpecification <TConsumer> specification)
        {
            var options = specification.Options <BatchOptions>();

            var messageLimit     = options.MessageLimit;
            var timeLimit        = options.TimeLimit;
            var concurrencyLimit = options.ConcurrencyLimit;

            IConsumerMessageSpecification <TConsumer, Batch <TMessage> > batchMessageSpecification = specification.GetMessageSpecification <Batch <TMessage> >();

            var consumeFilter = new MethodConsumerMessageFilter <TConsumer, Batch <TMessage> >();

            IPipe <ConsumerConsumeContext <TConsumer, Batch <TMessage> > > batchConsumerPipe = batchMessageSpecification.Build(consumeFilter);

            var factory = new BatchConsumerFactory <TConsumer, TMessage>(consumerFactory, messageLimit, concurrencyLimit, timeLimit, batchConsumerPipe);

            IConsumerSpecification <IConsumer <TMessage> > messageConsumerSpecification =
                ConsumerConnectorCache <IConsumer <TMessage> > .Connector.CreateConsumerSpecification <IConsumer <TMessage> >();

            IConsumerMessageSpecification <IConsumer <TMessage>, TMessage> messageSpecification =
                messageConsumerSpecification.GetMessageSpecification <TMessage>();

            IPipe <ConsumerConsumeContext <IConsumer <TMessage>, TMessage> > consumerPipe =
                messageSpecification.Build(new MethodConsumerMessageFilter <IConsumer <TMessage>, TMessage>());

            IPipe <ConsumeContext <TMessage> > messagePipe = messageSpecification.BuildMessagePipe(x =>
            {
                x.UseFilter(new ConsumerMessageFilter <IConsumer <TMessage>, TMessage>(factory, consumerPipe));
            });

            var handle = consumePipe.ConnectConsumePipe(messagePipe);

            return(new BatchConnectHandle(handle, factory));
        }
Example #7
0
        ConnectHandle ConnectStartJobConsumer(IConsumePipeConnector consumePipe, IConsumerSpecification <StartJobConsumer <TJob> > specification,
                                              JobOptions <TJob> options, IJobService jobService, IPipe <ConsumeContext <TJob> > pipe)
        {
            var consumerFactory = new DelegateConsumerFactory <StartJobConsumer <TJob> >(() => new StartJobConsumer <TJob>(jobService, options, pipe));

            return(_startJobConsumerConnector.ConnectConsumer(consumePipe, consumerFactory, specification));
        }
Example #8
0
        ConnectHandle ConnectSubmitJobConsumer(IConsumePipeConnector consumePipe,
                                               IConsumerSpecification <SubmitJobConsumer <TJob> > specification, JobOptions <TJob> options)
        {
            var consumerFactory = new DelegateConsumerFactory <SubmitJobConsumer <TJob> >(() => new SubmitJobConsumer <TJob>(options));

            return(_submitJobConsumerConnector.ConnectConsumer(consumePipe, consumerFactory, specification));
        }
Example #9
0
        ConnectHandle ConnectCancelJobConsumer(IConsumePipeConnector consumePipe, IConsumerSpecification <CancelJobConsumer <TJob> > specification,
                                               IJobService jobService)
        {
            var consumerFactory = new DelegateConsumerFactory <CancelJobConsumer <TJob> >(() => new CancelJobConsumer <TJob>(jobService));

            return(_cancelJobConsumerConnector.ConnectConsumer(consumePipe, consumerFactory, specification));
        }
Example #10
0
        ConnectHandle IConsumerConnector.ConnectConsumer <TConsumer>(IConsumePipeConnector consumePipe, IConsumerFactory <TConsumer> consumerFactory,
                                                                     IConsumerSpecification <TConsumer> specification)
        {
            var handles = new List <ConnectHandle>();

            try
            {
                foreach (IConsumerMessageConnector <TConsumer> connector in _connectors.Cast <IConsumerMessageConnector <TConsumer> >())
                {
                    var handle = connector.ConnectConsumer(consumePipe, consumerFactory, specification);

                    handles.Add(handle);
                }

                return(new MultipleConnectHandle(handles));
            }
            catch (Exception)
            {
                foreach (var handle in handles)
                {
                    handle.Dispose();
                }
                throw;
            }
        }
Example #11
0
        public ConnectHandle ConnectSaga <T>(IConsumePipeConnector consumePipe, ISagaRepository <T> sagaRepository,
                                             params IPipeSpecification <SagaConsumeContext <T> >[] pipeSpecifications)
            where T : class, ISaga
        {
            var handles = new List <ConnectHandle>();

            try
            {
                foreach (var connector in _connectors)
                {
                    var handle = connector.ConnectSaga(consumePipe, sagaRepository, pipeSpecifications);

                    handles.Add(handle);
                }

                return(new MultipleConnectHandle(handles));
            }
            catch (Exception)
            {
                foreach (var handle in handles)
                {
                    handle.Dispose();
                }
                throw;
            }
        }
        public static ConnectHandle ConnectStateMachineSaga <TInstance>(this IConsumePipeConnector pipe, IKernel kernel)
            where TInstance : class, SagaStateMachineInstance
        {
            SagaStateMachine <TInstance> stateMachine = kernel.ResolveSagaStateMachine <TInstance>();

            return(pipe.ConnectStateMachineSaga(stateMachine, kernel));
        }
Example #13
0
        ConnectHandle IInstanceMessageConnector <TConsumer> .ConnectInstance(IConsumePipeConnector pipeConnector, TConsumer instance,
                                                                             IConsumerSpecification <TConsumer> specification)
        {
            if (pipeConnector == null)
            {
                throw new ArgumentNullException(nameof(pipeConnector));
            }
            if (instance == null)
            {
                throw new ArgumentNullException(nameof(instance));
            }
            if (specification == null)
            {
                throw new ArgumentNullException(nameof(specification));
            }

            IConsumerMessageSpecification <TConsumer, TMessage> messageSpecification = specification.GetMessageSpecification <TMessage>();

            IPipe <ConsumerConsumeContext <TConsumer, TMessage> > consumerPipe = messageSpecification.Build(_consumeFilter);

            IPipe <ConsumeContext <TMessage> > messagePipe = Pipe.New <ConsumeContext <TMessage> >(x =>
            {
                x.UseFilter(new InstanceMessageFilter <TConsumer, TMessage>(instance, consumerPipe));
            });

            return(pipeConnector.ConnectConsumePipe(messagePipe));
        }
Example #14
0
        public ConnectHandle ConnectInstance <T>(IConsumePipeConnector pipeConnector, T instance, IConsumerSpecification <T> specification)
            where T : class
        {
            var handles = new List <ConnectHandle>();

            try
            {
                foreach (IInstanceMessageConnector <T> connector in _connectors.Cast <IInstanceMessageConnector <T> >())
                {
                    var handle = connector.ConnectInstance(pipeConnector, instance, specification);

                    handles.Add(handle);
                }

                return(new MultipleConnectHandle(handles));
            }
            catch (Exception)
            {
                foreach (var handle in handles)
                {
                    handle.Dispose();
                }
                throw;
            }
        }
Example #15
0
        public ConnectHandle ConnectConsumer(IConsumePipeConnector consumePipe, IConsumerFactory <TConsumer> consumerFactory,
                                             IConsumerSpecification <TConsumer> specification)
        {
            var options = specification.Options <BatchOptions>();

            var messageLimit     = options.MessageLimit;
            var timeLimit        = options.TimeLimit;
            var concurrencyLimit = options.ConcurrencyLimit;

            IConsumerMessageSpecification <TConsumer, Batch <TMessage> > batchMessageSpecification = specification.GetMessageSpecification <Batch <TMessage> >();

            var consumeFilter = new MethodConsumerMessageFilter <TConsumer, Batch <TMessage> >();

            IPipe <ConsumerConsumeContext <TConsumer, Batch <TMessage> > > batchConsumerPipe = batchMessageSpecification.Build(consumeFilter);

            IPipe <ConsumeContext <Batch <TMessage> > > batchMessagePipe = batchMessageSpecification.BuildMessagePipe(x =>
            {
                x.UseFilter(new ConsumerMessageFilter <TConsumer, Batch <TMessage> >(consumerFactory, batchConsumerPipe));
            });

            IBatchCollector <TMessage> collector = null;

            if (options.GroupKeyProvider == null)
            {
                collector = new BatchCollector <TMessage>(messageLimit, timeLimit, concurrencyLimit, batchMessagePipe);
            }
            else
            {
                if (options.GroupKeyProvider.GetType().ClosesType(typeof(IGroupKeyProvider <,>), out Type[] types))
Example #16
0
        ConnectHandle ConnectSuperviseJobConsumer(IConsumePipeConnector consumePipe, IConsumerSpecification <SuperviseJobConsumer> specification,
                                                  IJobService jobService)
        {
            var consumerFactory = new DelegateConsumerFactory <SuperviseJobConsumer>(() => new SuperviseJobConsumer(jobService));

            return(_superviseJobConsumerConnector.ConnectConsumer(consumePipe, consumerFactory, specification));
        }
Example #17
0
        public ConnectHandle ConnectConsumer(IConsumePipeConnector consumePipe, IConsumerFactory <TConsumer> consumerFactory,
                                             IConsumerSpecification <TConsumer> specification)
        {
            var jobServiceOptions = specification.Options <JobServiceOptions>();

            if (jobServiceOptions.JobService == null)
            {
                throw new ConfigurationException(
                          "The job service must be configured prior to configuring a job consumer, using either ConfigureJobServiceEndpoints or ConfigureJobService");
            }

            var options = specification.Options <JobOptions <TJob> >();

            IConsumerMessageSpecification <TConsumer, TJob> messageSpecification = specification.GetMessageSpecification <TJob>();

            var turnoutSpecification = messageSpecification as JobConsumerMessageSpecification <TConsumer, TJob>;

            if (turnoutSpecification == null)
            {
                throw new ArgumentException("The consumer specification did not match the message specification type");
            }

            var submitJobHandle = ConnectSubmitJobConsumer(consumePipe, turnoutSpecification.SubmitJobSpecification, options);

            var startJobHandle = ConnectStartJobConsumer(consumePipe, turnoutSpecification.StartJobSpecification, options, jobServiceOptions.JobService,
                                                         CreateJobPipe(consumerFactory, specification));

            var cancelJobHandle = ConnectSuperviseJobConsumer(consumePipe, turnoutSpecification.SuperviseJobSpecification, jobServiceOptions.JobService);

            return(new MultipleConnectHandle(submitJobHandle, startJobHandle, cancelJobHandle));
        }
Example #18
0
        public static ConnectHandle ConnectStateMachineSaga <TInstance>(this IConsumePipeConnector bus, SagaStateMachine <TInstance> stateMachine,
                                                                        ISagaRepository <TInstance> repository)
            where TInstance : class, SagaStateMachineInstance
        {
            var connector = new StateMachineConnector <TInstance>(stateMachine);

            return(connector.ConnectSaga(bus, repository));
        }
        public static ConnectHandle ConnectStateMachineSaga <TInstance>(this IConsumePipeConnector pipe, SagaStateMachine <TInstance> stateMachine,
                                                                        IWindsorContainer container)
            where TInstance : class, SagaStateMachineInstance
        {
            RegisterScopedContextProviderIfNotPresent(container);

            return(ConnectStateMachineSaga(pipe, stateMachine, container.Kernel));
        }
Example #20
0
        ConnectHandle ConnectFinalizeJobConsumer(IConsumePipeConnector consumePipe, IConsumerSpecification <FinalizeJobConsumer <TJob> > specification,
                                                 JobOptions <TJob> options, Guid jobTypeId, IJobService jobService)
        {
            var consumerFactory = new DelegateConsumerFactory <FinalizeJobConsumer <TJob> >(() => new FinalizeJobConsumer <TJob>(jobService, options, jobTypeId,
                                                                                                                                 TypeMetadataCache <TConsumer> .ShortName));

            return(_finalizeJobConsumerConnector.ConnectConsumer(consumePipe, consumerFactory, specification));
        }
        public ConnectHandle ConnectHandler(IConsumePipeConnector consumePipe, MessageHandler <TMessage> handler,
                                            IBuildPipeConfigurator <ConsumeContext <TMessage> > configurator)
        {
            configurator ??= new PipeConfigurator <ConsumeContext <TMessage> >();
            configurator.AddPipeSpecification(new HandlerPipeSpecification <TMessage>(handler));

            return(consumePipe.ConnectConsumePipe(configurator.Build()));
        }
        public static ConnectHandle ConnectStateMachineSaga <TInstance>(this IConsumePipeConnector pipe, ILifetimeScope scope, string name = "message",
                                                                        Action <ContainerBuilder, ConsumeContext> configureScope           = null)
            where TInstance : class, SagaStateMachineInstance
        {
            SagaStateMachine <TInstance> stateMachine = ResolveSagaStateMachine <TInstance>(scope);

            return(pipe.ConnectStateMachineSaga(stateMachine, scope, name, configureScope));
        }
Example #23
0
        public static ConnectHandle ConnectStateMachineSaga <TInstance>(this IConsumePipeConnector pipe, IContainer container,
                                                                        Action <ConsumeContext> configureScope = null)
            where TInstance : class, SagaStateMachineInstance
        {
            SagaStateMachine <TInstance> stateMachine = GetSagaStateMachine <TInstance>(container);

            return(pipe.ConnectStateMachineSaga(stateMachine, container, configureScope));
        }
Example #24
0
        public static ConnectHandle ConnectStateMachineSaga <TInstance>(this IConsumePipeConnector bus, SagaStateMachine <TInstance> stateMachine,
                                                                        Container container, Action <ISagaConfigurator <TInstance> > configure = null)
            where TInstance : class, SagaStateMachineInstance
        {
            ISagaRepository <TInstance> repository = CreateSagaRepository <TInstance>(container);

            return(bus.ConnectStateMachineSaga(stateMachine, repository, configure));
        }
        public static ConnectHandle ConnectStateMachineSaga<TInstance>(this IConsumePipeConnector bus, SagaStateMachine<TInstance> stateMachine,
            ISagaRepositoryFactory repositoryFactory, Action<ISagaConfigurator<TInstance>> configure = null)
            where TInstance : class, SagaStateMachineInstance
        {
            var repository = repositoryFactory.CreateSagaRepository<TInstance>();

            return ConnectStateMachineSaga(bus, stateMachine, repository, configure);
        }
        /// <summary>
        /// Subscribe a consumer with a default constructor to the bus's default endpoint
        /// </summary>
        /// <typeparam name="TConsumer"></typeparam>
        /// <param name="connector"></param>
        /// <param name="pipeSpecifications"></param>
        /// <returns></returns>
        public static ConnectHandle ConnectConsumer<TConsumer>(this IConsumePipeConnector connector,
            params IPipeSpecification<ConsumerConsumeContext<TConsumer>>[] pipeSpecifications)
            where TConsumer : class, IConsumer, new()
        {
            if (connector == null)
                throw new ArgumentNullException(nameof(connector));

            return ConnectConsumer(connector, new DefaultConstructorConsumerFactory<TConsumer>(), pipeSpecifications);
        }
        public static ConnectHandle ConnectStateMachineSaga <TInstance>(this IConsumePipeConnector pipe, IWindsorContainer container)
            where TInstance : class, SagaStateMachineInstance
        {
            ISagaStateMachineFactory stateMachineFactory = new WindsorSagaStateMachineFactory(container.Kernel);

            SagaStateMachine <TInstance> stateMachine = stateMachineFactory.CreateStateMachine <TInstance>();

            return(pipe.ConnectStateMachineSaga(stateMachine, container));
        }
Example #28
0
        private void ConnectPipe <TMessage>(IConsumePipeConnector pipeConnector) where TMessage : class
        {
            var pipe = Pipe.New <ConsumeContext <TMessage> >(cfg =>
            {
                cfg.UseExecute(ctx => _workflow.ConsumeMessage(ctx.Message));
            });

            pipeConnector.ConnectConsumePipe(pipe);
        }
Example #29
0
        public static ConnectHandle ConnectConsumer <T>(this IConsumePipeConnector filter, Func <T> factoryMethod, params IPipeSpecification <ConsumerConsumeContext <T> >[] specifications)
            where T : class
        {
            var consumerFactory = new DelegateConsumerFactory <T>(factoryMethod);

            IConsumerConnector connector = ConsumerConnectorCache.GetConsumerConnector <T>();

            return(connector.ConnectConsumer(filter, consumerFactory, specifications));
        }
Example #30
0
        public static ConnectHandle ConnectConsumer <T>(this IConsumePipeConnector filter,
                                                        params IPipeSpecification <ConsumerConsumeContext <T> >[] pipeSpecifications)
            where T : class, new()
        {
            var consumerFactory = new DefaultConstructorConsumerFactory <T>();

            IConsumerConnector connector = ConsumerConnectorCache.GetConsumerConnector <T>();

            return(connector.ConnectConsumer(filter, consumerFactory, pipeSpecifications));
        }