예제 #1
0
        public async Task SimplePublish()
        {
            const string expected = "GetDefaultHost message";

            _publisher.Start();

            SetupNormalQueue();

            await _publisher.ProduceAsync(expected);

            var result = ReadFromQueue();

            Assert.That(result, Is.EqualTo(expected));
        }
        public Common.IMessageProducer <TMessage> GetProducer <TMessage>(IReloadingManager <RabbitConnectionSettings> settings,
                                                                         bool isDurable, IRabbitMqSerializer <TMessage> serializer)
        {
            // on-the fly connection strings switch is not supported currently for rabbitMq
            var currSettings         = settings.CurrentValue;
            var subscriptionSettings = new RabbitMqSubscriptionSettings
            {
                ConnectionString = currSettings.ConnectionString,
                ExchangeName     = currSettings.ExchangeName,
                IsDurable        = isDurable,
            };

            return((Common.IMessageProducer <TMessage>)_producers.GetOrAdd(subscriptionSettings, CreateProducer).Value);

            Lazy <IStartStop> CreateProducer(RabbitMqSubscriptionSettings s)
            {
                // Lazy ensures RabbitMqPublisher will be created and started only once
                // https://andrewlock.net/making-getoradd-on-concurrentdictionary-thread-safe-using-lazy/
                return(new Lazy <IStartStop>(() =>
                {
                    var result = new RabbitMqPublisher <TMessage>(_loggerFactory, s).DisableInMemoryQueuePersistence()
                                 .SetSerializer(serializer)
                                 .SetWriteHeadersFunc(_correlationManager.BuildCorrelationHeadersIfExists);
                    result.Start();
                    return result;
                }));
            }
        }
예제 #3
0
        public static void Example(RabbitMqSubscriptionSettings settings)
        {
            var connection = new RabbitMqPublisher <string>(new NullLoggerFactory(), settings)
                             .SetSerializer(new TestMessageSerializer())
                             .SetPublishStrategy(new DefaultFanoutPublishStrategy(settings));

            connection.Start();

            for (var i = 0; i <= 10; i++)
            {
                connection.ProduceAsync("message#" + i);
            }
        }
        public static void UseEmailSenderViaRabbitMq(this IServiceCollection serviceCollection,
                                                     RabbitMqSettings rabbitMqSettings, ILog log)
        {
            var rabbitMqBroker
                = new RabbitMqPublisher <EmailModel>(rabbitMqSettings)
                  .SetLogger(log)
                  .SetSerializer(new EmailRabbitMqSerializer());

            serviceCollection.AddSingleton <IEmailSender>(
                new EmailSenderViaQueue(rabbitMqBroker));

            rabbitMqBroker.Start();
        }
        public void Start()
        {
            var settings = RabbitMqSubscriptionSettings.CreateForPublisher(_settings.ConnectionString, _settings.ExchangeOrderBook);

            settings.ExchangeName           = _settings.ExchangeOrderBook;
            settings.DeadLetterExchangeName = string.Empty;
            settings.IsDurable = false;

            _publisher = new RabbitMqPublisher <OrderBook>(_logFactory, settings, false)
                         .DisableInMemoryQueuePersistence()
                         .SetSerializer(new JsonMessageSerializer <OrderBook>())
                         .SetPublishStrategy(new DefaultFanoutPublishStrategy(settings))
                         .SetConsole(new LogToConsole());

            _publisher.Start();
        }
예제 #6
0
        public async Task PublishAsync(List <TradeLogItem> message)
        {
            await _lock.WaitAsync();

            try
            {
                var publishStart = DateTime.UtcNow;
                await _publisher.ProduceAsync(message);

                var publishTime = DateTime.UtcNow.Subtract(publishStart);
                if (publishTime > _timeThreshold)
                {
                    _log.WriteWarning(nameof(TradesPublisher), nameof(PublishAsync), $"Long publish ({publishTime}): {message.ToJson()}");
                    _publisher.Stop();
                    _publisher.Start();
                }
            }
            finally
            {
                _lock.Release();
            }
        }
예제 #7
0
        private void RegisterPublishers(ContainerBuilder builder, IConsole consoleWriter)
        {
            var publishers = new List <string>
            {
                _settings.RabbitMqQueues.OrderHistory.ExchangeName,
                _settings.RabbitMqQueues.OrderbookPrices.ExchangeName,
                _settings.RabbitMqQueues.AccountMarginEvents.ExchangeName,
                _settings.RabbitMqQueues.AccountStats.ExchangeName,
                _settings.RabbitMqQueues.Trades.ExchangeName,
                _settings.RabbitMqQueues.PositionHistory.ExchangeName,
                _settings.RabbitMqQueues.ExternalOrder.ExchangeName,
            };

            var bytesSerializer = new BytesStringSerializer();

            foreach (var exchangeName in publishers)
            {
                builder
                .Register(ctx =>
                {
                    var pub = new RabbitMqPublisher <string>(ctx.Resolve <ILoggerFactory>(), new RabbitMqSubscriptionSettings
                    {
                        ConnectionString = _settings.MtRabbitMqConnString,
                        ExchangeName     = exchangeName
                    })
                              .SetSerializer(bytesSerializer)
                              .SetPublishStrategy(new DefaultFanoutPublishStrategy(new RabbitMqSubscriptionSettings {
                        IsDurable = true
                    }))
                              .DisableInMemoryQueuePersistence()
                              .SetWriteHeadersFunc(ctx.Resolve <RabbitMqCorrelationManager>().BuildCorrelationHeadersIfExists);
                    pub.Start();
                    return(pub);
                })
                .Named <IMessageProducer <string> >(exchangeName)
                .As <IStartStop>()
                .SingleInstance();
            }
        }
예제 #8
0
 public ActivityService(RabbitMqPublisher <SessionActivity> publisher)
 {
     this.publisher = publisher;
     publisher.Start();
 }
        public void QueuePersistenceShouldBeConfiguredExplicitly()
        {
            Assert.Throws <InvalidOperationException>(() => _publisher.Start());

            _publisher.Stop();
        }