示例#1
0
        /// <summary>
        /// Sends a request to target with a JSON model, waits response
        /// </summary>
        public async Task <HorseResult <TResponse> > RequestJson <TResponse>(string target, ushort?contentType, object model,
                                                                             IEnumerable <KeyValuePair <string, string> > messageHeaders = null)
        {
            TypeDeliveryDescriptor descriptor = _client.DeliveryContainer.GetDescriptor(model.GetType());
            HorseMessage           message    = descriptor.CreateMessage(MessageType.DirectMessage, target, contentType);

            message.Serialize(model, _client.JsonSerializer);

            if (messageHeaders != null)
            {
                foreach (KeyValuePair <string, string> pair in messageHeaders)
                {
                    message.AddHeader(pair.Key, pair.Value);
                }
            }

            HorseMessage responseMessage = await _client.Request(message);

            if (responseMessage.ContentType == 0)
            {
                TResponse response = responseMessage.Deserialize <TResponse>(_client.JsonSerializer);
                return(new HorseResult <TResponse>(response, message, HorseResultCode.Ok));
            }

            return(new HorseResult <TResponse>(default, responseMessage, (HorseResultCode)responseMessage.ContentType));
示例#2
0
        /// <summary>
        /// Pushes a message to a queue
        /// </summary>
        public async Task <HorseResult> PushJson(string queue, object jsonObject, string messageId, bool waitAcknowledge,
                                                 IEnumerable <KeyValuePair <string, string> > messageHeaders = null)
        {
            TypeDeliveryDescriptor descriptor = _client.DeliveryContainer.GetDescriptor(jsonObject.GetType());
            HorseMessage           message    = descriptor.CreateMessage(MessageType.QueueMessage, queue, 0);

            if (!string.IsNullOrEmpty(messageId))
            {
                message.SetMessageId(messageId);
            }

            message.WaitResponse = waitAcknowledge;

            if (messageHeaders != null)
            {
                foreach (KeyValuePair <string, string> pair in messageHeaders)
                {
                    message.AddHeader(pair.Key, pair.Value);
                }
            }

            message.Serialize(jsonObject, _client.JsonSerializer);

            if (string.IsNullOrEmpty(message.MessageId) && waitAcknowledge)
            {
                message.SetMessageId(_client.UniqueIdGenerator.Create());
            }

            return(await _client.WaitResponse(message, waitAcknowledge));
        }
示例#3
0
        /// <summary>
        /// Sends a JSON message by full name
        /// </summary>
        public async Task <HorseResult> SendJson <T>(T model, bool waitAcknowledge, IEnumerable <KeyValuePair <string, string> > messageHeaders = null)
        {
            TypeDeliveryDescriptor descriptor = _client.DeliveryContainer.GetDescriptor(model.GetType());
            HorseMessage           message    = descriptor.CreateMessage(MessageType.DirectMessage, null, null);

            if (string.IsNullOrEmpty(message.Target))
            {
                return(new HorseResult(HorseResultCode.SendError));
            }

            message.WaitResponse = waitAcknowledge;
            message.Serialize(model, _client.JsonSerializer);

            if (messageHeaders != null)
            {
                foreach (KeyValuePair <string, string> pair in messageHeaders)
                {
                    message.AddHeader(pair.Key, pair.Value);
                }
            }

            if (waitAcknowledge)
            {
                return(await _client.SendAndGetAck(message));
            }

            return(await _client.SendAsync(message));
        }
示例#4
0
        /// <summary>
        /// Publishes a JSON object to a router
        /// </summary>
        public async Task <HorseResult> PublishJson(string routerName,
                                                    object model,
                                                    string messageId        = null,
                                                    bool waitForAcknowledge = false,
                                                    ushort?contentType      = null,
                                                    IEnumerable <KeyValuePair <string, string> > messageHeaders = null)
        {
            TypeDeliveryDescriptor descriptor = _client.DeliveryContainer.GetDescriptor(model.GetType());
            HorseMessage           message    = descriptor.CreateMessage(MessageType.Router, routerName, contentType);

            if (!string.IsNullOrEmpty(messageId))
            {
                message.SetMessageId(messageId);
            }
            else
            {
                message.SetMessageId(_client.UniqueIdGenerator.Create());
            }

            message.WaitResponse = waitForAcknowledge;
            message.Serialize(model, _client.JsonSerializer);

            if (messageHeaders != null)
            {
                foreach (KeyValuePair <string, string> pair in messageHeaders)
                {
                    message.AddHeader(pair.Key, pair.Value);
                }
            }

            return(await _client.WaitResponse(message, waitForAcknowledge));
        }
示例#5
0
        /// <summary>
        /// Unsubscribe from direct messages
        /// </summary>
        public void OffDirect <T>()
        {
            TypeDeliveryDescriptor descriptor = _deliveryContainer.GetDescriptor <T>();

            if (descriptor == null)
            {
                throw new ArgumentNullException("Can't resolve TypeDeliveryDescriptor. Use overload method On(ushort,T)");
            }

            if (!descriptor.ContentType.HasValue)
            {
                throw new NullReferenceException("Type doesn't have ContentTypeAttribute. Add that attribute to type or use overload method On(ushort,T)");
            }

            OffDirect(descriptor.ContentType.Value);
        }
示例#6
0
        /// <summary>
        /// Unsubscribe from messages of a queue
        /// </summary>
        public void Off <T>()
        {
            TypeDeliveryDescriptor descriptor = _deliveryContainer.GetDescriptor <T>();

            if (descriptor == null)
            {
                throw new ArgumentNullException("Can't resolve TypeDeliveryDescriptor. Use overload method On(string,ushort,T)");
            }

            if (string.IsNullOrEmpty(descriptor.QueueName))
            {
                throw new NullReferenceException("Type doesn't have QueueNameAttribute. Add that attribute to type or use overload method On(string,ushort,T)");
            }

            Off(descriptor.QueueName);
        }
示例#7
0
        /// <summary>
        /// Finds target for consumer and model
        /// </summary>
        private Tuple <string, ushort> GetTarget(ReadSource source, TypeDeliveryDescriptor consumerDescriptor, TypeDeliveryDescriptor modelDescriptor)
        {
            ushort contentType = 0;
            string target      = null;

            if (source == ReadSource.Queue)
            {
                if (consumerDescriptor.HasQueueName)
                {
                    target = consumerDescriptor.QueueName;
                }
                else if (modelDescriptor.HasQueueName)
                {
                    target = modelDescriptor.QueueName;
                }
            }
            else
            {
                if (consumerDescriptor.HasContentType)
                {
                    contentType = consumerDescriptor.ContentType ?? 0;
                }
                else if (modelDescriptor.HasContentType)
                {
                    contentType = modelDescriptor.ContentType ?? 0;
                }

                if (consumerDescriptor.HasDirectReceiver)
                {
                    target = consumerDescriptor.DirectTarget;
                }
                else if (modelDescriptor.HasDirectReceiver)
                {
                    target = modelDescriptor.DirectTarget;
                }
            }

            if (source == ReadSource.Queue && string.IsNullOrEmpty(target))
            {
                target = modelDescriptor.QueueName;
            }

            return(new Tuple <string, ushort>(target, contentType));
        }
示例#8
0
        /// <summary>
        /// Returns all subscribed queues
        /// </summary>
        public Tuple <string, TypeDeliveryDescriptor>[] GetSubscribedQueues()
        {
            List <Tuple <string, TypeDeliveryDescriptor> > queues = new List <Tuple <string, TypeDeliveryDescriptor> >();

            lock (_subscriptions)
            {
                foreach (ReadSubscription subscription in _subscriptions)
                {
                    if (subscription.Source != ReadSource.Queue)
                    {
                        continue;
                    }

                    TypeDeliveryDescriptor descriptor = _deliveryContainer.GetDescriptor(subscription.MessageType);
                    queues.Add(new Tuple <string, TypeDeliveryDescriptor>(subscription.Queue, descriptor));
                }
            }

            return(queues.Distinct().ToArray());
        }
示例#9
0
        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);
        }