private ConsumerConnectionModel Subscribe(RabbitMqConsumerOptions consumerOptions) { var messageType = Type.GetType(consumerOptions.MessageTypeFullName); if (messageType == null) { throw new InvalidOperationException($"Failed get message type for {consumerOptions.MessageTypeFullName}"); } var handlerType = Type.GetType(consumerOptions.HandlerTypeFullName); if (handlerType == null) { throw new InvalidOperationException($"Failed get handler type for {consumerOptions.HandlerTypeFullName}"); } CheckHandlerIsResolvable(handlerType); var cc = new ConsumerConnectionModel { MaxParallelHandlers = consumerOptions.MaxParallelHandlers, MessageProccessRetryDelayInMilliseconds = consumerOptions.MessageProccessRetryDelayInMilliseconds, MessageProcessRetryCount = consumerOptions.MessageProcessRetryCount, PrefetchCount = consumerOptions.PrefetchCount }; var handlerInvokerType = typeof(MessageHandlerInvoker <,>).MakeGenericType(messageType, handlerType); cc.MessageHandlerInvoker = (IMessageHandlerInvoker)Activator.CreateInstance(handlerInvokerType, new object[] { _serviceProvider, cc.MessageProcessRetryCount, TimeSpan.FromMilliseconds(cc.MessageProccessRetryDelayInMilliseconds), cc.MaxParallelHandlers }); var subscribeAsync = typeof(IBus) .GetMethods() .FirstOrDefault(x => x.Name == nameof(IBus.SubscribeAsync) && x.GetParameters().Length == 2)? .MakeGenericMethod(messageType); if (subscribeAsync == null) { throw new InvalidOperationException("Unable to subscribe due to: IBus.SubscribeAsync not found"); } var bus = CreateBus(messageType, cc.PrefetchCount); var onMessage = cc.MessageHandlerInvoker.CreateHandlerDelegate(); cc.SubscriptionResult = (ISubscriptionResult)subscribeAsync.Invoke(bus, new object[] { _options.AppName, onMessage }); return(cc); }
public StreamFlowRabbitMq(IServiceCollection services, StreamFlowOptions options) { _services = services; _options = options; services.TryAddSingleton <IRabbitMqConventions, RabbitMqConventions>(); services.TryAddSingleton <IMessageSerializer, RabbitMqMessageSerializer>(); services.TryAddSingleton <IOutboxMessageAddressProvider, RabbitMqMessageAddressProvider>(); services.TryAddScoped <ILoggerScopeStateFactory, LoggerScopeStateFactory>(); services.TryAddSingleton <IRabbitMqMetrics, RabbitMqNoOpMetrics>(); services.TryAddScoped <IPublisher, RabbitMqPublisher>(); services.TryAddSingleton <IRabbitMqPublisherChannel, RabbitMqPublisherChannel>(); services.TryAddSingleton <IRabbitMqPublisherBus, RabbitMqPublisherBus>(); _publisherOptions = new RabbitMqPublisherOptions(); services.AddSingleton(_publisherOptions); _consumerOptions = new RabbitMqConsumerOptions(); services.AddSingleton(_consumerOptions); }