Пример #1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="eventSerialized"></param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        public Task ExecuteDomainSubscribers(string eventSerialized, CancellationToken cancellationToken)
        {
            var eventDeserialized = _deserializer.Deserialize(eventSerialized);

            return(Task.WhenAll(
                       DomainEventSubscriberInformationService
                       .GetAllEventsSubscribers(eventDeserialized)
                       .Select(subscriber =>
                               ExecuteDomainSubscriber(eventSerialized, eventDeserialized, subscriber, cancellationToken))));
        }
        public void Consume(DomainEvent @event)
        {
            var subscribers = DomainEventSubscriberInformationService.GetAllEventsSubscribers(@event);

            foreach (var subscriber in subscribers)
            {
                _domainEventsToExecute.Subscribers.Add(cancellationToken =>
                                                       _domainEventMediator.ExecuteOn(@event, subscriber, cancellationToken));
            }
            //return Task.WhenAll(subscribers.Select(subscriber =>
            //    _domainEventMediator.ExecuteOn(@event, subscriber, cancellationToken)));
        }
Пример #3
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="stoppingToken"></param>
        /// <returns></returns>
        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            using var initialScope = _serviceScopeFactory.CreateScope();

            var domainEventJsonDeserializer = initialScope.ServiceProvider.GetRequiredService <DomainEventJsonDeserializer>();

            var domainEventMediator = initialScope.ServiceProvider.GetRequiredService <DomainEventMediator>();

            var redisSubscriber = initialScope.ServiceProvider.GetRequiredService <IConnectionMultiplexer>().GetSubscriber();

            await redisSubscriber.SubscribeAsync("*", async (_, value) =>
            {
                var @event = domainEventJsonDeserializer.Deserialize(value);

                var subscribers = DomainEventSubscriberInformationService.GetAllEventsSubscribers(@event);

                await Task.WhenAll(subscribers.Select(subscriber =>
                                                      domainEventMediator.ExecuteOn(@event, subscriber, stoppingToken)));
            });
        }
Пример #4
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="stoppingToken"></param>
        /// <returns></returns>
        protected override Task ExecuteAsync(CancellationToken stoppingToken)
        {
            using var scope = _serviceScopeFactory.CreateScope();

            var channel = scope.ServiceProvider.GetRequiredService <RabbitMqConnectionFactory>().Channel();

            var exchangeName = scope.ServiceProvider.GetRequiredService <IOptions <RabbitMqConfigParams> >().Value.ExchangeName;

            var retryDomainEventExchange      = RabbitMqExchangeNameFormatter.Retry(exchangeName);
            var deadLetterDomainEventExchange = RabbitMqExchangeNameFormatter.DeadLetter(exchangeName);

            channel.ExchangeDeclare(exchangeName, ExchangeType.Topic);
            channel.ExchangeDeclare(retryDomainEventExchange, ExchangeType.Topic);
            channel.ExchangeDeclare(deadLetterDomainEventExchange, ExchangeType.Topic);

            foreach (var subscriberInformation in DomainEventSubscriberInformationService.All())
            {
                var domainEventsQueueName = RabbitMqQueueNameFormatter.Format(subscriberInformation);
                var retryQueueName        = RabbitMqQueueNameFormatter.FormatRetry(subscriberInformation);
                var deadLetterQueueName   = RabbitMqQueueNameFormatter.FormatDeadLetter(subscriberInformation);
                var subscribedEvent       = EventNameSubscribed(subscriberInformation);

                var queue = channel.QueueDeclare(domainEventsQueueName, true, false, false);

                var retryQueue = channel.QueueDeclare(retryQueueName, true, false, false,
                                                      RetryQueueArguments(exchangeName, domainEventsQueueName));

                var deadLetterQueue = channel.QueueDeclare(deadLetterQueueName, true, false, false);

                channel.QueueBind(queue, exchangeName, domainEventsQueueName);
                channel.QueueBind(retryQueue, retryDomainEventExchange, domainEventsQueueName);
                channel.QueueBind(deadLetterQueue, deadLetterDomainEventExchange, domainEventsQueueName);
                channel.QueueBind(queue, exchangeName, subscribedEvent);
            }

            return(scope.ServiceProvider.GetRequiredService <RabbitMqDomainEventsConsumer>().Consume());
        }
Пример #5
0
 /// <summary>
 ///
 /// </summary>
 /// <returns></returns>
 public Task Consume()
 {
     DomainEventSubscriberInformationService.GetAllEventsSubscribers().ForEach(eventSubscriber => ConsumeMessages(eventSubscriber));
     return(Task.CompletedTask);
 }