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); }
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); }