/// <inheritdoc /> public void Publish <TEvent>(TEvent @event) where TEvent : IntegrationEvent { if (@event == null) { throw new ArgumentNullException(nameof(@event)); } Connect(); using (var channel = _connection.CreateModel()) { var eventName = @event.GetType().Name; channel.ExchangeDeclare(BROKER_NAME, ExchangeType.Direct); var message = JsonConvert.SerializeObject(@event, typeof(TEvent), _serializeSetting); var body = Encoding.UTF8.GetBytes(message); var success = false; for (var time = 0; time < _retryCount; time++) { try { _diagnosticSource.BeforePublishEvent(@event); channel.BasicPublish(exchange: BROKER_NAME, routingKey: eventName, basicProperties: null, body: body); _diagnosticSource.AfterPublishEvent(@event); success = true; break; } catch (BrokerUnreachableException ex) { _logger.LogWarning("Rabbit Client publish message {3}: {0},{1} fail", @event.Id, @event.ToString(), @event.GetType()); _logger.LogWarning(ex.ToString()); _diagnosticSource.PublishRetry(@event, ex, time); } catch (SocketException ex) { _logger.LogWarning("Rabbit Client publish message {3}: {0},{1} fail", @event.Id, @event.ToString(), @event.GetType()); _logger.LogWarning(ex.ToString()); _diagnosticSource.PublishRetry(@event, ex, time); } catch (Exception ex) { _logger.LogCritical(0, ex, "FALTAL ERROR:A exception was occur during Rabbit Client publish message.."); _diagnosticSource.PublishFail(@event, ex); throw ex; } finally { time++; } } if (!success) { _diagnosticSource.PublishRetryFailed(@event); } } }