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