Exemplo n.º 1
0
        /// <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);
                }
            }
        }