/// <summary> /// Registers all IQueueConsumers in assemblies /// </summary> public IEnumerable <Type> RegisterAssemblyConsumers(Func <IConsumerFactory> consumerFactoryBuilder, params Type[] assemblyTypes) { List <Type> list = new List <Type>(); foreach (Type assemblyType in assemblyTypes) { foreach (Type type in assemblyType.Assembly.GetTypes()) { List <ModelTypeInfo> types = FindModelTypes(type); foreach (ModelTypeInfo typeInfo in types) { ReadSubscription subscription = CreateConsumerSubscription(typeInfo, consumerFactoryBuilder); if (subscription == null) { continue; } lock (_subscriptions) _subscriptions.Add(subscription); } if (types.Count > 0) { list.Add(type); } } } return(list); }
/// <summary> /// Subscribe to direct messages with a content type /// </summary> public void OnDirect <T>(ushort contentType, Action <T> action) { ReadSubscription subscription = new ReadSubscription { Source = ReadSource.Direct, ContentType = contentType, MessageType = typeof(T), Action = action }; lock (_subscriptions) _subscriptions.Add(subscription); }
/// <summary> /// Subscribe to messages from a queue /// </summary> public void On <T>(string queueName, Action <T> action) { ReadSubscription subscription = new ReadSubscription { Source = ReadSource.Queue, Queue = queueName, MessageType = typeof(T), Action = action }; lock (_subscriptions) _subscriptions.Add(subscription); }
/// <summary> /// Subscribe to direct messages with a content type /// </summary> public void OnDirect <T>(ushort contentType, Action <T, HorseMessage> action) { ReadSubscription subscription = new ReadSubscription { Source = ReadSource.Direct, ContentType = contentType, MessageType = typeof(T), Action = action, HmqMessageParameter = true }; lock (_subscriptions) _subscriptions.Add(subscription); }
/// <summary> /// Subscribe to messages of a queue /// </summary> public void On <T>(string queueName, Action <T, HorseMessage> action) { ReadSubscription subscription = new ReadSubscription { Source = ReadSource.Queue, Queue = queueName, MessageType = typeof(T), Action = action, HmqMessageParameter = true }; lock (_subscriptions) _subscriptions.Add(subscription); }
/// <summary> /// Registers a single consumer /// </summary> public void RegisterConsumer(Type consumerType, Func <IConsumerFactory> consumerFactoryBuilder = null) { List <ModelTypeInfo> types = FindModelTypes(consumerType); foreach (ModelTypeInfo typeInfo in types) { ReadSubscription subscription = CreateConsumerSubscription(typeInfo, consumerFactoryBuilder); if (subscription == null) { throw new TypeLoadException("Cant resolve consumer type"); } lock (_subscriptions) _subscriptions.Add(subscription); } }
/// <summary> /// Subscribes to handle requests /// </summary> public void OnRequest <TRequest, TResponse>(ushort contentType, IHorseRequestHandler <TRequest, TResponse> handler) { ReadSubscription subscription = new ReadSubscription { Source = ReadSource.Request, Queue = null, ContentType = contentType, MessageType = typeof(TRequest), Action = null, HmqMessageParameter = true, ConsumerExecuter = new RequestHandlerExecuter <TRequest, TResponse>(handler.GetType(), handler, null) }; lock (_subscriptions) _subscriptions.Add(subscription); }
private ReadSubscription CreateConsumerSubscription(ModelTypeInfo typeInfo, Func <IConsumerFactory> consumerFactoryBuilder) { bool useConsumerFactory = consumerFactoryBuilder != null; TypeDeliveryResolver resolver = new TypeDeliveryResolver(); TypeDeliveryDescriptor consumerDescriptor = resolver.Resolve(typeInfo.ConsumerType, null); TypeDeliveryDescriptor modelDescriptor = resolver.Resolve(typeInfo.ModelType, Configurator); var target = GetTarget(typeInfo.Source, consumerDescriptor, modelDescriptor); object consumerInstance = useConsumerFactory ? null : Activator.CreateInstance(typeInfo.ConsumerType); ConsumerExecuter executer = null; switch (typeInfo.Source) { case ReadSource.Queue: { Type executerType = typeof(QueueConsumerExecuter <>); Type executerGenericType = executerType.MakeGenericType(typeInfo.ModelType); executer = (ConsumerExecuter)Activator.CreateInstance(executerGenericType, typeInfo.ConsumerType, consumerInstance, consumerFactoryBuilder); break; } case ReadSource.Direct: { Type executerType = typeof(DirectConsumerExecuter <>); Type executerGenericType = executerType.MakeGenericType(typeInfo.ModelType); executer = (ConsumerExecuter)Activator.CreateInstance(executerGenericType, typeInfo.ConsumerType, consumerInstance, consumerFactoryBuilder); break; } case ReadSource.Request: { Type executerType = typeof(RequestHandlerExecuter <,>); Type executerGenericType = executerType.MakeGenericType(typeInfo.ModelType, typeInfo.ResponseType); executer = (ConsumerExecuter)Activator.CreateInstance(executerGenericType, typeInfo.ConsumerType, consumerInstance, consumerFactoryBuilder); break; } } if (executer != null) { executer.Resolve(Configurator); } ReadSubscription subscription = new ReadSubscription { Source = typeInfo.Source, Queue = target.Item1, ContentType = target.Item2, MessageType = typeInfo.ModelType, ResponseType = typeInfo.ResponseType, Action = null, ConsumerExecuter = executer }; return(subscription); }