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