Exemplo n.º 1
0
        public MessagePublisher(
            IModel channel,
            string exchangeName,
            string correlationId,
            ICompositeFormatterResolver formatterResolver)
        {
            if (string.IsNullOrWhiteSpace(exchangeName))
            {
                throw new ArgumentException("Should be not empty string", nameof(exchangeName));
            }

            _channel           = channel ?? throw new ArgumentNullException(nameof(channel));
            _exchangeName      = exchangeName;
            _correlationId     = correlationId;
            _formatterResolver = formatterResolver ?? throw new ArgumentNullException(nameof(formatterResolver));
        }
Exemplo n.º 2
0
        /// <summary>
        /// RabbitMq endpoint - represents RabbitMq connection and provides entry points
        /// to start listening for the messages and publish messages.
        /// </summary>
        public RabbitMqEndpoint(
            IServiceProvider serviceProvider,
            ILogFactory logFactory,
            Uri connectionString,
            string vhost = null)
        {
            _serviceProvider  = serviceProvider ?? throw new ArgumentNullException(nameof(serviceProvider));
            _logFactory       = logFactory ?? throw new ArgumentNullException(nameof(logFactory));
            _connectionString = connectionString ?? throw new ArgumentNullException(nameof(connectionString));
            _vhost            = vhost;
            _log = logFactory.CreateLog(this);
            _formatterResolver = new CompositeFormatterResolver();
            _subscribers       = new List <MessageSubscriber>();

            _formatterResolver.RegisterResolvers(MoneyResolver.Instance);
        }
Exemplo n.º 3
0
        public MessageProcessor(
            TimeSpan defaultRetryTimeout,
            ICompositeFormatterResolver formatterResolver,
            IInternalMessageQueue internalQueue,
            ILogFactory logFactory,
            Func <string, IMessagePublisher> repliesPublisher,
            IRejectManager rejectManager,
            IRetryManager retryManager,
            IServiceProvider serviceProvider,
            IMessageSubscriptionsRegistry subscriptionsRegistry) : base(logFactory)
        {
            _defaultRetryTimeout = defaultRetryTimeout;
            _formatterResolver   = formatterResolver;
            _internalQueue       = internalQueue;
            _log                   = logFactory.CreateLog(this);
            _logFactory            = logFactory;
            _repliesPublisher      = repliesPublisher;
            _rejectManager         = rejectManager;
            _retryManager          = retryManager;
            _serviceProvider       = serviceProvider;
            _subscriptionsRegistry = subscriptionsRegistry;

            _id = Interlocked.Increment(ref _instanceCounter);
        }
Exemplo n.º 4
0
        public static MessageSubscriber Create(IServiceProvider serviceProvider,
                                               IMessageSubscriptionsRegistry subscriptionsRegistry,
                                               IConnection connection,
                                               ILogFactory logFactory,
                                               ICompositeFormatterResolver formatterResolver,
                                               Func <string, IMessagePublisher> repliesPublisher,
                                               string exchangeName,
                                               string queueName,
                                               TimeSpan defaultFirstLevelRetryTimeout,
                                               TimeSpan maxFirstLevelRetryMessageAge,
                                               int maxFirstLevelRetryCount,
                                               int firstLevelRetryQueueCapacity,
                                               int processingQueueCapacity,
                                               int messageConsumersCount,
                                               int messageProcessorsCount)
        {
            var log = logFactory.CreateLog(typeof(MessageSubscriber));

            log.Info("Creating RabbitMq subscriber...", new
            {
                exchangeName,
                queueName,
                defaultFirstLevelRetryTimeout,
                maxFirstLevelRetryMessageAge,
                maxFirstLevelRetryCount,
                firstLevelRetryQueueCapacity,
                processingQueueCapacity,
                messageConsumersCount,
                messageProcessorsCount
            });

            var internalQueue = new InternalMessageQueue(processingQueueCapacity);
            var rejectManager = new RejectManager(logFactory);
            var retryManager  = new RetryManager
                                (
                logFactory,
                maxFirstLevelRetryMessageAge,
                maxFirstLevelRetryCount,
                firstLevelRetryQueueCapacity,
                internalQueue
                                );

            var messageConsumers = new List <IMessageConsumer>(messageConsumersCount);

            for (var i = 0; i < messageConsumersCount; i++)
            {
                messageConsumers.Add(new MessageConsumer
                                     (
                                         connection,
                                         internalQueue,
                                         logFactory,
                                         queueName
                                     ));
            }

            var messageProcessors = new List <IMessageProcessor>(messageConsumersCount);

            for (var i = 0; i < messageProcessorsCount; i++)
            {
                messageProcessors.Add(new MessageProcessor
                                      (
                                          defaultFirstLevelRetryTimeout,
                                          formatterResolver,
                                          internalQueue,
                                          logFactory,
                                          repliesPublisher,
                                          rejectManager,
                                          retryManager,
                                          serviceProvider,
                                          subscriptionsRegistry
                                      ));
            }

            using (var channel = connection.CreateModel())
            {
                channel.BasicQos(0, 100, false);
                channel.QueueDeclare(queueName, true, false, false, null);

                log.Info($"Start receiving messages from the exchange {exchangeName} via the queue {queueName}:");

                foreach (var subscription in subscriptionsRegistry.GetAllSubscriptions())
                {
                    log.Info($"Binding message {subscription.RoutingKey}...");

                    channel.QueueBind(queueName, exchangeName, subscription.RoutingKey, null);
                }
            }

            return(new MessageSubscriber
                   (
                       messageConsumers,
                       messageProcessors,
                       rejectManager,
                       retryManager
                   ));
        }