Esempio n. 1
0
        private void ConsumeMessages(string eventSubscriber, ushort prefetchCount = 10)
        {
            var channel = _config.Channel();

            DeclareQueue(channel, eventSubscriber);

            channel.BasicQos(0, prefetchCount, false);
            var consumer = new EventingBasicConsumer(channel);

            consumer.Received += async(_, ea) =>
            {
                try
                {
                    var body    = ea.Body.ToArray();
                    var message = Encoding.UTF8.GetString(body);

                    var @event = _deserializer.Deserialize(message);

                    await _domainEventMediator.ExecuteOn(@event, eventSubscriber, CancellationToken.None);
                }
                catch (Exception ex)
                {
                    _logger.Error(ex, ex.Message);
                    HandleConsumptionError(ea, eventSubscriber);
                }

                channel.BasicAck(ea.DeliveryTag, false);
            };

            channel.BasicConsume(eventSubscriber, false, consumer);
        }
Esempio n. 2
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="event"></param>
        /// <param name="cancellationToken">Propagates notification that operations should be canceled.</param>
        /// <returns></returns>
        public Task Publish(DomainEvent @event, CancellationToken cancellationToken)
        {
            return(_executeMiddlewaresService.ExecuteAsync(@event, cancellationToken, (req, _) =>
            {
                try
                {
                    var serializedDomainEvent = _domainEventJsonSerializer.Serialize(req);

                    var channel = _config.Channel();
                    channel.ExchangeDeclare(_rabbitMqParams.Value.ExchangeName, ExchangeType.Topic);

                    var body = Encoding.UTF8.GetBytes(serializedDomainEvent);
                    var properties = channel.CreateBasicProperties();
                    properties.Headers = new Dictionary <string, object> {
                        { HeaderReDelivery, 0 }
                    };

                    channel.BasicPublish(_rabbitMqParams.Value.ExchangeName, req.GetEventName(), properties, body);
                }
                catch (RabbitMQClientException)
                {
                    //await _failOverPublisher.Publish(new List<DomainEvent> {domainEvent}, cancellationToken);
                }

                return Task.CompletedTask;
            }));
        }