예제 #1
0
        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);
        }