Beispiel #1
0
        public void ShouldUseDeadLetterQueueOnException()
        {
            _subscriber = new RabbitMqSubscriber <string>(
                new NullLogger <RabbitMqSubscriber <string> >(),
                _settings)
                          .UseMiddleware(new ExceptionSwallowMiddleware <string>(new NullLogger <ExceptionSwallowMiddleware <string> >()))
                          .CreateDefaultBinding()
                          .SetMessageDeserializer(new DefaultStringDeserializer());

            const string expected = "GetDefaultHost message";

            SetupNormalQueue();
            PublishToQueue(expected);

            var completeLock = new ManualResetEventSlim(false);
            var handler      = new Func <string, Task>(s =>
            {
                completeLock.Set();
                throw new Exception();
            });

            _subscriber.Subscribe(handler);
            _subscriber.Start();

            completeLock.Wait();

            var result = ReadFromQueue(PoisonQueueName);

            Assert.That(result, Is.EqualTo(expected));
        }
Beispiel #2
0
        public static IObservable <T> ReadAsJson <T>(RabbitMqSubscriptionSettings settings, ILogFactory log)
        {
            return(Observable.Create <T>(async(obs, ct) =>
            {
                var subscriber = new RabbitMqSubscriber <T>(
                    log,
                    settings,
                    new ResilientErrorHandlingStrategy(
                        settings: settings,
                        logFactory: log,
                        retryTimeout: TimeSpan.FromSeconds(10),
                        next: new DeadQueueErrorHandlingStrategy(log, settings)))
                                 .SetMessageDeserializer(new JsonMessageDeserializer <T>())
                                 .Subscribe(x =>
                {
                    obs.OnNext(x);
                    return Task.CompletedTask;
                })
                                 .CreateDefaultBinding();

                using (subscriber.Start())
                {
                    var cts = new TaskCompletionSource <Unit>();
                    ct.Register(() => cts.SetResult(Unit.Default));
                    await cts.Task;
                }

                obs.OnCompleted();
            }));
        }
Beispiel #3
0
        public void Start()
        {
            var settings = new RabbitMqSubscriptionSettings
            {
                ConnectionString = _settings.ConnectionString,
                QueueName        = _settings.QueueName,
                ExchangeName     = _settings.ExchangeName,
                IsDurable        = false
            };

            _subscriber = new RabbitMqSubscriber <TickPrice>(
                _logFactory,
                settings,
                new ResilientErrorHandlingStrategy(
                    settings: settings,
                    logFactory: _logFactory,
                    retryTimeout: TimeSpan.FromSeconds(10)))
                          .SetMessageDeserializer(new JsonMessageDeserializer <TickPrice>())
                          .Subscribe(ProcessMessageAsync)
                          .CreateDefaultBinding();

            _subscriber.Start();

            _log.Info($"<< {nameof(TickPricesSubscriber)} is started.");
        }
Beispiel #4
0
 public void Start()
 {
     if (_enabled)
     {
         _messageProducer.Start();
     }
 }
Beispiel #5
0
        public void Subscribe <TMessage>(IReloadingManager <RabbitConnectionSettings> settings, bool isDurable,
                                         Func <TMessage, Task> handler)
        {
            // on-the fly connection strings switch is not supported currently for rabbitMq
            var currSettings         = settings.CurrentValue;
            var subscriptionSettings = new RabbitMqSubscriptionSettings
            {
                ConnectionString = currSettings.ConnectionString,
                QueueName        =
                    $"{currSettings.ExchangeName}.{PlatformServices.Default.Application.ApplicationName}{currSettings.AdditionalQueueSuffix}",
                ExchangeName = currSettings.ExchangeName,
                IsDurable    = isDurable,
            };

            var rabbitMqSubscriber = new RabbitMqSubscriber <TMessage>(subscriptionSettings,
                                                                       new DefaultErrorHandlingStrategy(_logger, subscriptionSettings))
                                     .SetMessageDeserializer(new JsonMessageDeserializer <TMessage>(JsonSerializerSettings))
                                     .Subscribe(handler)
                                     .SetLogger(_logger);

            if (!_subscribers.TryAdd(subscriptionSettings.QueueName, rabbitMqSubscriber))
            {
                throw new InvalidOperationException(
                          $"A subscriber for queue {subscriptionSettings.QueueName} was already initialized");
            }

            rabbitMqSubscriber.Start();
        }
Beispiel #6
0
        public void Start()
        {
            var settings = new RabbitMqSubscriptionSettings
            {
                ConnectionString       = _settings.ConnectionString,
                ExchangeName           = _settings.Exchange,
                QueueName              = $"{_settings.Exchange}.{_settings.QueueSuffix}",
                IsDurable              = false,
                DeadLetterExchangeName = null
            };

            _subscriber = new RabbitMqSubscriber <TickPriceExt>(
                _logFactory,
                settings,
                new ResilientErrorHandlingStrategy(
                    settings: settings,
                    logFactory: _logFactory,
                    retryTimeout: TimeSpan.FromSeconds(10),
                    next: new DeadQueueErrorHandlingStrategy(_logFactory, settings)))
                          .SetMessageDeserializer(new JsonMessageDeserializer <TickPriceExt>())
                          .Subscribe(HandleTickPrice)
                          .CreateDefaultBinding();

            _subscriber.Start();
        }
Beispiel #7
0
        public void Subscribe <TMessage>(RabbitMqSettings settings, bool isDurable,
                                         Func <TMessage, Task> handler, IMessageDeserializer <TMessage> deserializer)
        {
            var subscriptionSettings = new RabbitMqSubscriptionSettings
            {
                ConnectionString = settings.ConnectionString,
                QueueName        = QueueHelper.BuildQueueName(settings.ExchangeName, _env),
                ExchangeName     = settings.ExchangeName,
                IsDurable        = isDurable,
            };

            var rabbitMqSubscriber = new RabbitMqSubscriber <TMessage>(subscriptionSettings,
                                                                       new DefaultErrorHandlingStrategy(_logger, subscriptionSettings))
                                     .SetMessageDeserializer(deserializer)
                                     .Subscribe(handler)
                                     .SetLogger(_logger)
                                     .SetConsole(_consoleWriter);

            if (!_subscribers.TryAdd(subscriptionSettings, rabbitMqSubscriber))
            {
                throw new InvalidOperationException(
                          $"A subscriber for queue {subscriptionSettings.QueueName} was already initialized");
            }

            rabbitMqSubscriber.Start();
        }
        public void ShouldUseDeadLetterQueueOnException()
        {
            _subscriber = new RabbitMqSubscriber <string>(
                EmptyLogFactory.Instance,
                _settings,
                new DeadQueueErrorHandlingStrategy(EmptyLogFactory.Instance, _settings))
                          .CreateDefaultBinding()
                          .SetMessageDeserializer(new DefaultStringDeserializer());

            const string expected = "GetDefaultHost message";

            SetupNormalQueue();
            PublishToQueue(expected);

            var completeLock = new ManualResetEventSlim(false);
            var handler      = new Func <string, Task>(s =>
            {
                completeLock.Set();
                throw new Exception();
            });

            _subscriber.Subscribe(handler);
            _subscriber.Start();

            completeLock.Wait();

            var result = ReadFromQueue(PoisonQueueName);

            Assert.That(result, Is.EqualTo(expected));
        }
Beispiel #9
0
        public void Subscribe <TMessage>(RabbitConnectionSettings settings, bool isDurable,
                                         Func <TMessage, Task> handler, IMessageDeserializer <TMessage> deserializer)
        {
            var subscriptionSettings = new RabbitMqSubscriptionSettings
            {
                ConnectionString = settings.ConnectionString,
                QueueName        =
                    $"{settings.ExchangeName}.{PlatformServices.Default.Application.ApplicationName}.{settings.RoutingKey ?? "all"}",
                ExchangeName = settings.ExchangeName,
                RoutingKey   = settings.RoutingKey,
                IsDurable    = isDurable,
            };

            var rabbitMqSubscriber = new RabbitMqSubscriber <TMessage>(subscriptionSettings,
                                                                       new DefaultErrorHandlingStrategy(_logger, subscriptionSettings))
                                     .SetMessageDeserializer(deserializer)
                                     .Subscribe(handler)
                                     .SetLogger(_logger);

            if (!_subscribers.TryAdd(subscriptionSettings.QueueName, rabbitMqSubscriber))
            {
                throw new InvalidOperationException(
                          $"A subscriber for queue {subscriptionSettings.QueueName} was already initialized");
            }

            rabbitMqSubscriber.Start();
        }
        public void Subscribe <TMessage>(IReloadingManager <RabbitConnectionSettings> settings, bool isDurable,
                                         Func <TMessage, Task> handler)
        {
            // on-the fly connection strings switch is not supported currently for rabbitMq
            var currSettings         = settings.CurrentValue;
            var subscriptionSettings = new RabbitMqSubscriptionSettings
            {
                ConnectionString = currSettings.ConnectionString,
                QueueName        =
                    $"{currSettings.ExchangeName}.{PlatformServices.Default.Application.ApplicationName}",
                ExchangeName = currSettings.ExchangeName,
                IsDurable    = isDurable,
            };

            var rabbitMqSubscriber = new RabbitMqSubscriber <TMessage>(
                _loggerFactory.CreateLogger <RabbitMqSubscriber <TMessage> >(),
                subscriptionSettings)
                                     .SetMessageDeserializer(new JsonMessageDeserializer <TMessage>(JsonSerializerSettings))
                                     .Subscribe(handler)
                                     .UseMiddleware(new ExceptionSwallowMiddleware <TMessage>(
                                                        _loggerFactory.CreateLogger <ExceptionSwallowMiddleware <TMessage> >()))
                                     .SetReadHeadersAction(_correlationManager.FetchCorrelationIfExists);

            if (!_subscribers.TryAdd(subscriptionSettings.QueueName, rabbitMqSubscriber))
            {
                throw new InvalidOperationException(
                          $"A subscriber for queue {subscriptionSettings.QueueName} was already initialized");
            }

            rabbitMqSubscriber.Start();
        }
 public void Start()
 {
     if (!_enabled)
     {
         return;
     }
     _rabbit.Start();
     _log.WriteInfoAsync(nameof(IcmTickPriceHarvester), "Initializing", "", "Started");
 }
        public void Start()
        {
            if (!_config.RabbitMq.TickPrices.Enabled && !_config.RabbitMq.OrderBooks.Enabled)
            {
                return;
            }

            _rabbit.Start();
            _log.WriteInfoAsync(nameof(ICMTickPriceHarvester), "Initializing", "", "Started");
        }
Beispiel #13
0
        static void Main(string[] args)
        {
            Console.Title = typeof(Program).Assembly.GetName().Name;
            Log.Logger    = new LoggerConfiguration()
                            .WriteTo.File($"C:\\RealTimeHimFileDropTest\\Logs\\{DateTime.Now.ToString("MM_dd_yyyy")}_{Environment.UserName}.{typeof(Program).Assembly.GetName().Name}.log")
                            .CreateLogger();
            var subscriber = new RabbitMqSubscriber(GetSettings());

            subscriber.Start();
        }
        public void ReceivingMessagesWhenOneRabbitIsNotReachable()
        {
            // arrange
            var settings = new RabbitMqSubscriptionSettings
            {
                ConnectionString = InvalidConnectionString,
                ExchangeName     = ExchangeName,
                IsDurable        = true,
                QueueName        = QueueName
            };

            _subscriber = new RabbitMqSubscriber <string>(
                EmptyLogFactory.Instance,
                settings,
                new DefaultErrorHandlingStrategy(EmptyLogFactory.Instance, settings))
                          .SetMessageDeserializer(new DefaultStringDeserializer())
                          .SetMessageReadStrategy(new MessageReadQueueStrategy())
                          .SetAlternativeExchange(AlternativeConnectionString)
                          .SetDeduplicator(new InMemoryDeduplcator())
                          .CreateDefaultBinding();

            var handler = new Func <string, Task>(s =>
            {
                _messagesCount++;
                return(Task.CompletedTask);
            });

            _subscriber.Subscribe(handler);
            _subscriber.Start();

            // act
            {
                var factory = new ConnectionFactory {
                    Uri = new Uri(AlternativeConnectionString)
                };
                using (var connection = factory.CreateConnection())
                    using (var channel = connection.CreateModel())
                    {
                        channel.BasicPublish(ExchangeName, "", body: Encoding.UTF8.GetBytes("1"));
                        channel.BasicPublish(ExchangeName, "", body: Encoding.UTF8.GetBytes("3"));
                        channel.BasicPublish(ExchangeName, "", body: Encoding.UTF8.GetBytes("4"));
                    }
            }

            Thread.Sleep(TimeSpan.FromSeconds(2));

            // assert
            Assert.AreEqual(3, _messagesCount);
        }
        public void Start()
        {
            var settings = RabbitMqSubscriptionSettings
                           .ForSubscriber(_connectionString, _exchangeName, "tradesconverter")
                           .MakeDurable()
                           .UseRoutingKey(((int)MessageType.Order).ToString());

            _subscriber = new RabbitMqSubscriber <ExecutionEvent>(
                settings,
                new ResilientErrorHandlingStrategy(_log, settings,
                                                   retryTimeout: TimeSpan.FromSeconds(10),
                                                   next: new DeadQueueErrorHandlingStrategy(_log, settings)))
                          .SetMessageDeserializer(new ProtobufMessageDeserializer <ExecutionEvent>())
                          .SetMessageReadStrategy(new MessageReadQueueStrategy())
                          .Subscribe(ProcessMessageAsync)
                          .CreateDefaultBinding()
                          .SetLogger(_log);
#if !DEBUG
            _subscriber.Start();
#endif
        }
        public void SuccessfulPath()
        {
            const string expected = "GetDefaultHost message";

            string result = null;

            SetupNormalQueue();
            var completeLock = new ManualResetEventSlim(false);
            var handler      = new Func <string, Task>(s =>
            {
                result = s;
                completeLock.Set();
                return(Task.CompletedTask);
            });

            _subscriber.Subscribe(handler);

            _subscriber.Start();

            PublishToQueue(expected);

            completeLock.Wait();
            Assert.That(result, Is.EqualTo(expected));
        }
        public void ReceivingAndDeduplicationMessagesFromBothExchanges()
        {
            // arrange
            var settings = new RabbitMqSubscriptionSettings
            {
                ConnectionString = ConnectionString,
                ExchangeName     = ExchangeName,
                IsDurable        = true,
                QueueName        = QueueName
            };

            _subscriber = new RabbitMqSubscriber <string>(
                new NullLogger <RabbitMqSubscriber <string> >(),
                settings)
                          .UseMiddleware(new InMemoryDeduplicationMiddleware <string>())
                          .UseMiddleware(new ExceptionSwallowMiddleware <string>(new NullLogger <ExceptionSwallowMiddleware <string> >()))
                          .SetMessageDeserializer(new DefaultStringDeserializer())
                          .SetMessageReadStrategy(new MessageReadQueueStrategy())
                          .SetAlternativeExchange(AlternativeConnectionString)
                          .CreateDefaultBinding();

            var handler = new Func <string, Task>(s =>
            {
                _messagesCount++;
                return(Task.CompletedTask);
            });

            _subscriber.Subscribe(handler);
            _subscriber.Start();

            // act
            {
                var factory = new ConnectionFactory {
                    Uri = new Uri(ConnectionString, UriKind.Absolute)
                };
                using (var connection = factory.CreateConnection())
                    using (var channel = connection.CreateModel())
                    {
                        channel.BasicPublish(ExchangeName, "", body: Encoding.UTF8.GetBytes("1"));
                        channel.BasicPublish(ExchangeName, "", body: Encoding.UTF8.GetBytes("2"));
                        channel.BasicPublish(ExchangeName, "", body: Encoding.UTF8.GetBytes("4"));
                    }
            }
            {
                var factory = new ConnectionFactory {
                    Uri = new Uri(AlternativeConnectionString, UriKind.Absolute)
                };
                using (var connection = factory.CreateConnection())
                    using (var channel = connection.CreateModel())
                    {
                        channel.BasicPublish(ExchangeName, "", body: Encoding.UTF8.GetBytes("1"));
                        channel.BasicPublish(ExchangeName, "", body: Encoding.UTF8.GetBytes("3"));
                        channel.BasicPublish(ExchangeName, "", body: Encoding.UTF8.GetBytes("4"));
                    }
            }

            Thread.Sleep(TimeSpan.FromSeconds(2));

            // assert
            Assert.AreEqual(4, _messagesCount);
        }
Beispiel #18
0
 public void Start()
 {
     _connector.Start();
 }