Ejemplo n.º 1
0
        public Task Publish <TEvent>(TEvent @event, string exchange, CancellationToken cancellationToken) where TEvent : IEvent
        {
            var policy = Policy.Handle <BrokerUnreachableException>()
                         .Or <SocketException>()
                         .WaitAndRetry(_options.PublishRetryCount,
                                       retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)), (ex, _) =>
            {
                _logger.LogWarning(ex.ToString());
            });

            _connection.VerifyConnection();

            exchange ??= _options.PublishExchange ?? _options.Exchanges.FirstOrDefault();
            var channel = _connection.CreateModel();

            channel.ExchangeDeclare(exchange: exchange, type: "direct");

            var message = JsonSerializer.Serialize(@event);
            var body    = Encoding.UTF8.GetBytes(message);

            var eventName = @event.GetType().Name;

            policy.Execute(() =>
            {
                channel.BasicPublish(exchange, eventName, null, body);
            });

            return(Task.CompletedTask);
        }
Ejemplo n.º 2
0
        private IModel CreateConsumerChannel()
        {
            _connection.VerifyConnection();
            var channel = _connection.CreateModel();

            foreach (var exchange in _exchanges)
            {
                channel.ExchangeDeclare(exchange: exchange, type: "direct");
            }

            channel.QueueDeclare(queue: _queueName, durable: true, exclusive: false, autoDelete: false, arguments: null);
            channel.CallbackException += (sender, ea) =>
            {
                _consumerChannel.Dispose();
                _consumerChannel = CreateConsumerChannel();
            };
            return(channel);
        }