예제 #1
0
파일: RogerBus.cs 프로젝트: simoneb/Roger
        /// <summary>
        /// Default library entry point
        /// </summary>
        /// <param name="connectionFactory"></param>
        /// <param name="consumerContainer"></param>
        /// <param name="exchangeResolver"></param>
        /// <param name="serializer"></param>
        /// <param name="idGenerator"></param>
        /// <param name="sequenceGenerator"></param>
        /// <param name="options"> </param>
        public RogerBus(IConnectionFactory connectionFactory,
                        IConsumerContainer consumerContainer = null,
                        IExchangeResolver exchangeResolver   = null,
                        IMessageSerializer serializer        = null,
                        IIdGenerator idGenerator             = null,
                        ISequenceGenerator sequenceGenerator = null,
                        RogerOptions options = null)
        {
            aggregator        = new Aggregator();
            reconnectionTimer = new SystemThreadingTimer();
            connection        = new ReliableConnection(connectionFactory, reconnectionTimer, aggregator);

            consumerContainer = consumerContainer.Or(new EmptyConsumerContainer());
            exchangeResolver  = exchangeResolver.Or(new AttributeExchangeResolver());
            serializer        = serializer.Or(new ProtoBufNetSerializer());
            idGenerator       = idGenerator.Or(new RandomIdGenerator());
            sequenceGenerator = sequenceGenerator.Or(new ByMessageHirarchyRootSequenceGenerator());
            options           = options.Or(new RogerOptions());

            publishModules.Add(new BasicReturnModule());

            if (options.UsePublisherConfirms)
            {
                publishModules.AddFirst(new PublisherConfirmsModule(TimeSpan.FromSeconds(5), TimeSpan.FromSeconds(10)));
            }

            var queueFactory = new DefaultQueueFactory(true,
                                                       false,
                                                       false,
                                                       options.QueueUnusedTimeout,
                                                       options.MessageTimeToLiveOnQueue,
                                                       options.QueueName);

            Filters.Add(new ResequencingDeduplicationFilter());

            consumer = new DefaultConsumingProcess(idGenerator,
                                                   exchangeResolver,
                                                   serializer,
                                                   new DefaultMessageTypeResolver(),
                                                   consumerContainer,
                                                   Filters,
                                                   queueFactory,
                                                   new AlwaysSuccessConsumerInvoker(),
                                                   options,
                                                   aggregator);

            publisher = new QueueingPublishingProcess(idGenerator,
                                                      sequenceGenerator,
                                                      exchangeResolver,
                                                      serializer,
                                                      new DefaultMessageTypeResolver(),
                                                      publishModules,
                                                      aggregator);


            aggregator.Subscribe(this);
        }
예제 #2
0
        private void StartOrResumeConsumingFromConnection(IReliableConnection connection)
        {
            if (consumingTask != null)
            {
                log.Info("Consuming already running, letting current consuming loop complete and will restart consuming when completed");

                consumingTask = consumingTask.ContinueWith(task => StartConsuming(connection), TaskContinuationOptions.AttachedToParent);
                return;
            }

            StartConsuming(connection);
        }
        public void Setup()
        {
            connection = Substitute.For <IReliableConnection>();
            model      = Substitute.For <IModelWithConnection>();
            connection.CreateModel().Returns(model);
            publishModule = Substitute.For <IPublishModule>();

            aggregator = new Aggregator();
            sut        = new QueueingPublishingProcess(Substitute.For <IIdGenerator>(),
                                                       Substitute.For <ISequenceGenerator>(),
                                                       Substitute.For <IExchangeResolver>(),
                                                       Substitute.For <IMessageSerializer>(),
                                                       Substitute.For <IMessageTypeResolver>(),
                                                       publishModule, aggregator);
            sut.Start();
        }
        public void Setup()
        {
            connection = Substitute.For<IReliableConnection>();
            model = Substitute.For<IModelWithConnection>();
            connection.CreateModel().Returns(model);
            publishModule = Substitute.For<IPublishModule>();

            aggregator = new Aggregator();
            sut = new QueueingPublishingProcess(Substitute.For<IIdGenerator>(),
                                                Substitute.For<ISequenceGenerator>(),
                                                Substitute.For<IExchangeResolver>(),
                                                Substitute.For<IMessageSerializer>(),
                                                Substitute.For<IMessageTypeResolver>(),
                                                publishModule, aggregator);
            sut.Start();
        }
예제 #5
0
        public void Setup()
        {
            connection = Substitute.For<IReliableConnection>();
            model = Substitute.For<IModelWithConnection>();
            connection.CreateModel().Returns(model);

            queueFactory = Substitute.For<IQueueFactory>();
            aggregator = new Aggregator();

            sut = new DefaultConsumingProcess(Substitute.For<IIdGenerator>(),
                                              Substitute.For<IExchangeResolver>(),
                                              Substitute.For<IMessageSerializer>(),
                                              Substitute.For<IMessageTypeResolver>(),
                                              Substitute.For<IConsumerContainer>(),
                                              Substitute.For<IMessageFilter>(),
                                              queueFactory,
                                              Substitute.For<IConsumerInvoker>(),
                                              new RogerOptions(), aggregator);
        }
예제 #6
0
        public void Setup()
        {
            connection = Substitute.For <IReliableConnection>();
            model      = Substitute.For <IModelWithConnection>();
            connection.CreateModel().Returns(model);

            queueFactory = Substitute.For <IQueueFactory>();
            aggregator   = new Aggregator();

            sut = new DefaultConsumingProcess(Substitute.For <IIdGenerator>(),
                                              Substitute.For <IExchangeResolver>(),
                                              Substitute.For <IMessageSerializer>(),
                                              Substitute.For <IMessageTypeResolver>(),
                                              Substitute.For <IConsumerContainer>(),
                                              Substitute.For <IMessageFilter>(),
                                              queueFactory,
                                              Substitute.For <IConsumerInvoker>(),
                                              new RogerOptions(), aggregator);
        }
예제 #7
0
        private void StartConsuming(IReliableConnection connection)
        {
            Model = connection.CreateModel();
            Model.ModelShutdown += ModelOnModelShutdown;

            if (options.PrefetchCount.HasValue)
            {
                log.InfoFormat("Setting QoS with prefetch count {0} on consuming channel", options.PrefetchCount);
                Model.BasicQos(0, options.PrefetchCount.Value, false);
            }

            Endpoint = new RogerEndpoint(Endpoint.IsEmpty ? queueFactory.Create(Model) : queueFactory.Create(Endpoint.Queue, Model));

            CreateBindings(new HashSet <Type>(consumerContainer.GetAllConsumerTypes().SelectMany(supportedMessageTypesResolver.Resolve)));
            log.DebugFormat("Declared and eventually bound endpoint {0}", Endpoint);

            aggregator.Notify(new ConsumingEnabled(Endpoint, connection));

            CreateConsumer();

            consumingTask = Task.Factory.StartNew(ConsumeSynchronously, TaskCreationOptions.LongRunning);
        }
예제 #8
0
 public ConnectionEstablished(IReliableConnection connection)
 {
     Connection = connection;
 }
예제 #9
0
 public ModelWithConnectionDecorator(IModel model, IReliableConnection connection)
 {
     Connection = connection;
     this.model = model;
 }
예제 #10
0
 public ConsumingEnabled(RogerEndpoint endpoint, IReliableConnection connection)
 {
     Endpoint = endpoint;
     Connection = connection;
 }
예제 #11
0
 public ModelWithConnectionDecorator(IModel model, IReliableConnection connection)
 {
     Connection = connection;
     this.model = model;
 }
예제 #12
0
 public ConnectionEstablished(IReliableConnection connection)
 {
     Connection = connection;
 }
예제 #13
0
 public ConsumingEnabled(RogerEndpoint endpoint, IReliableConnection connection)
 {
     Endpoint   = endpoint;
     Connection = connection;
 }