Exemple #1
0
        /// <summary>
        /// Distributes the message to all bindings
        /// </summary>
        private async Task <RouterPublishResult> Distribute(MqClient sender, HorseMessage message)
        {
            RouterPublishResult result = RouterPublishResult.NoReceivers;

            foreach (Binding binding in Bindings)
            {
                bool oldWaitResponse = message.WaitResponse;
                bool sent            = await binding.Send(sender, message);

                message.WaitResponse = oldWaitResponse;
                if (sent)
                {
                    if (binding.Interaction != BindingInteraction.None)
                    {
                        result = RouterPublishResult.OkAndWillBeRespond;
                    }

                    else if (result == RouterPublishResult.NoReceivers)
                    {
                        result = RouterPublishResult.OkWillNotRespond;
                    }
                }
            }

            return(result);
        }
Exemple #2
0
        /// <summary>
        /// Sends the message to only first binding
        /// </summary>
        private async Task <RouterPublishResult> OnlyFirst(MqClient sender, HorseMessage message)
        {
            int  index = 0;
            bool sent;
            RouterPublishResult result = RouterPublishResult.NoReceivers;

            do
            {
                if (index >= Bindings.Length)
                {
                    return(RouterPublishResult.NoReceivers);
                }

                Binding binding = Bindings[index];
                sent = await binding.Send(sender, message);

                if (sent)
                {
                    result = binding.Interaction != BindingInteraction.None
                                 ? RouterPublishResult.OkAndWillBeRespond
                                 : RouterPublishResult.OkWillNotRespond;
                }

                index++;
            }while (!sent);

            return(result);
        }
Exemple #3
0
        public async Task Handle(MqClient client, HorseMessage message, bool fromNode)
        {
            IRouter router = _server.FindRouter(message.Target);

            if (router == null)
            {
                await SendResponse(RouterPublishResult.Disabled, client, message);

                return;
            }

            RouterPublishResult result = await router.Publish(client, message);

            await SendResponse(result, client, message);
        }
Exemple #4
0
        /// <summary>
        /// Sends negative ack or failed response if client is pending ack or response
        /// </summary>
        private static Task SendResponse(RouterPublishResult result, MqClient client, HorseMessage message)
        {
            if (result == RouterPublishResult.OkAndWillBeRespond)
            {
                return(Task.CompletedTask);
            }

            bool positive = result == RouterPublishResult.OkWillNotRespond;

            if (message.WaitResponse)
            {
                HorseMessage response = positive
                                            ? message.CreateAcknowledge()
                                            : message.CreateResponse(HorseResultCode.NotFound);

                return(client.SendAsync(response));
            }

            return(Task.CompletedTask);
        }