Exemplo n.º 1
0
        private void DoInternalSubscription <TEvent>() where TEvent : Event
        {
            var eventName   = _subscriptionsManager.GetEventKey <TEvent>();
            var containsKey = _subscriptionsManager.HasSubscriptions <TEvent>();

            if (!containsKey)
            {
                if (!_persistentConnection.IsConnected)
                {
                    _persistentConnection.TryConnect();
                }

                using (var channel = _persistentConnection.CreateModel())
                {
                    var args = new Dictionary <string, object>();
                    args.Add("x-dead-letter-exchange", DLX_BROKER_NAME);

                    channel.QueueDeclare(
                        queue: _queueName,
                        durable: true,
                        exclusive: false,
                        autoDelete: false,
                        arguments: args);

                    channel.QueueBind(
                        queue: _queueName,
                        exchange: BROKER_NAME,
                        routingKey: eventName,
                        args);

                    channel.QueueBind(RETRY_QUEUE, DLX_BROKER_NAME, eventName);
                    channel.QueueBind(RETRY_ALT_QUEUE, BROKER_ALT_NAME, eventName);
                }
            }
        }
Exemplo n.º 2
0
        async Task ProcessEventAsync(string eventName, string eventMessage)
        {
            if (!subscriptionsManager.HasSubscriptions(eventName))
            {
                return;
            }

            var eventType     = subscriptionsManager.GetEventType(eventName);
            var @event        = JsonSerializer.Deserialize(eventMessage, eventType);
            var handlerMethod = typeof(IEventHandler <>).MakeGenericType(eventType).GetMethod(nameof(IEventHandler <object> .HandleAsync));

            var handlerTypes = subscriptionsManager.GetEventHandlerTypes(eventName);

            using var scope = serviceProvider.CreateScope();
            foreach (var handlerType in handlerTypes)
            {
                try
                {
                    var handler = ActivatorUtilities.GetServiceOrCreateInstance(scope.ServiceProvider, handlerType);
                    await(Task) handlerMethod.Invoke(handler, new[] { @event });
                    logger.LogDebug($"{handlerType.FullName}=>{eventMessage}");
                }
                catch (Exception ex)
                {
                    logger.LogError($"{ex.Message} in {handlerType.FullName}=>{eventMessage}");
                }
            }
        }
Exemplo n.º 3
0
        /// <summary>
        ///
        /// </summary>
        /// <typeparam name="TEvent"></typeparam>
        /// <typeparam name="TEventHandler"></typeparam>
        public void RegisterEventHandler <TEvent, TEventHandler>()
            where TEventHandler : IEventHandler <TEvent>
        {
            var eventName = subscriptionsManager.GetEventKey <TEvent>();

            if (subscriptionsManager.HasSubscriptions(eventName))
            {
                return;
            }

            if (!connection.IsConnected)
            {
                connection.TryConnect();
            }

            using var model = connection.CreateModel();
            model.QueueBind(
                queue: settings.QueueName,
                exchange: BROKER_NAME,
                routingKey: eventName);

            subscriptionsManager.AddSubscription <TEvent, TEventHandler>();
        }