private static void CreateConsumers(IDependencyResolver resolver, IAdvancedBus advancedBus, ExchangeItem exchangeItem) { if (exchangeItem.RabbitExchange == null) { throw new ArgumentException("rabbit exchange is null`"); } foreach (var income in exchangeItem.In) { var queue = advancedBus.QueueDeclare(string.Format("{0}.{1}", exchangeItem.Name, income.Key)); advancedBus.Bind(exchangeItem.RabbitExchange, queue, income.Key); var messageType = ReflectionHelper.ResolveType(income.Type); if (messageType == null) { throw new Exception("no such message type"); } Type consType = ReflectionHelper.ResolveType(income.React); var consumer = resolver.Resolve(consType); var endpointInfo = EndpointInfoFactory.Create(advancedBus, exchangeItem.RabbitExchange, income.Name, income.Key); var handlerReg = GetHandlerRegistration(endpointInfo, consumer, messageType); IList <object> consumeInvokeParams = new List <object>(); consumeInvokeParams.Add(queue); var action = ConsumeWrapperProvider.GetConsumeActionWrapper(handlerReg, resolver); consumeInvokeParams.Add(action); if (!ConsumerActions.TryAdd(consumer.GetType(), action)) { Logger.Warn("can't add consumer handler for {0}", consumer.GetType().ToString()); } Action <IConsumerConfiguration> consConf = configuration => configuration.WithPrefetchCount(exchangeItem.PrefetchCount); consumeInvokeParams.Add(consConf); //NOTE: Such ugly shit to get generic overloaded method var sbConsume = typeof(IAdvancedBus).GetMethods().Where(x => x.Name == "Consume").Select(m => new { Method = m, Params = m.GetParameters(), Args = m.GetGenericArguments() }).Where(x => x.Params.Length == 3 && x.Args.Length == 0 && x.Params[1].ParameterType.Name == action.GetType().Name) .Select(x => x.Method) .First(); sbConsume.Invoke(advancedBus, consumeInvokeParams.ToArray()); } }
public PlatformBusBuilder AddConsumerInterceptor <TInterceptor>(IList <Type> typesToDecorate) where TInterceptor : IConsumerInterceptor { ConsumeWrapperProvider.AddConsumerDecorator <TInterceptor>(typesToDecorate); return(this); }