예제 #1
0
        /// <summary>
        /// Routes message to it's type handler
        /// </summary>
        private async Task RouteToHandler(MqClient mc, TmqMessage message, IConnectionInfo info)
        {
            switch (message.Type)
            {
            //client sends a queue message in a channel
            case MessageType.Channel:
                await _instanceHandler.Handle(mc, message);

                await _channelHandler.Handle(mc, message);

                break;

            //clients sends a message to another client
            case MessageType.Client:
                await _instanceHandler.Handle(mc, message);

                await _clientHandler.Handle(mc, message);

                break;

            //client sends an acknowledge message of a message
            case MessageType.Acknowledge:
                await _instanceHandler.Handle(mc, message);

                await _acknowledgeHandler.Handle(mc, message);

                break;

            //client sends a response message for a message
            case MessageType.Response:
                await _instanceHandler.Handle(mc, message);

                await _responseHandler.Handle(mc, message);

                break;

            //client sends a message to the server
            //this message may be join, header, info, some another server message
            case MessageType.Server:
                await _serverHandler.Handle(mc, message);

                break;

            //if client sends a ping message, response with pong
            case MessageType.Ping:
                await mc.SendAsync(PredefinedMessages.PONG);

                break;

            //client sends PONG message
            case MessageType.Pong:
                mc.KeepAlive();
                break;

            //close the client's connection
            case MessageType.Terminate:
                mc.Disconnect();
                break;
            }
        }
예제 #2
0
        /// <summary>
        /// Routes message to it's type handler
        /// </summary>
        internal Task RouteToHandler(MqClient mc, HorseMessage message, bool fromNode)
        {
            switch (message.Type)
            {
            //client sends a queue message
            case MessageType.QueueMessage:
                if (!fromNode)
                {
                    _ = _instanceHandler.Handle(mc, message, false);
                }
                return(_queueMessageHandler.Handle(mc, message, fromNode));

            case MessageType.Router:
                if (!fromNode)
                {
                    _ = _instanceHandler.Handle(mc, message, false);
                }
                return(_routerMessageHandler.Handle(mc, message, fromNode));

            //sends pull request to a queue
            case MessageType.QueuePullRequest:
                return(_pullRequestHandler.Handle(mc, message, fromNode));

            //clients sends a message to another client
            case MessageType.DirectMessage:
                if (!fromNode)
                {
                    _ = _instanceHandler.Handle(mc, message, false);
                }
                return(_clientHandler.Handle(mc, message, fromNode));

            //client sends a response message for a message
            case MessageType.Response:
                if (!fromNode)
                {
                    _ = _instanceHandler.Handle(mc, message, false);
                }
                return(_responseHandler.Handle(mc, message, fromNode));

            //client sends a message to the server
            //this message may be join, header, info, some another server message
            case MessageType.Server:
                return(_serverHandler.Handle(mc, message, fromNode));

            //event subscription or unsubscription request received
            case MessageType.Event:
                return(_eventHandler.Handle(mc, message, fromNode));

            //if client sends a ping message, response with pong
            case MessageType.Ping:
                return(mc.SendAsync(PredefinedMessages.PONG));

            //client sends PONG message
            case MessageType.Pong:
                mc.KeepAlive();
                break;

            //close the client's connection
            case MessageType.Terminate:
                mc.Disconnect();
                break;
            }

            return(Task.CompletedTask);
        }