コード例 #1
0
        public MessageWorker() :
            base(TCPMonitorAdress, UDPMonitorAdress, ZSocketType.ROUTER, MessagingCoreSettings.Default.CoreSocketReceivePollRate)
        {
            m_cmdWorker = new CommandMessageWorker();
            m_processor = new MessageProcessor();

            m_decodeTransform = new TransformBlock <(TransportProtocol Protocol, ZMessage Message), MessageData>
                                    ((msg) =>
            {
                var decodedMsg      = MessageCodec.DecodeMessage(msg.Message);
                decodedMsg.Protocol = msg.Protocol;
                msg.Message.Dispose();
                return(decodedMsg);
            });

            m_decodedCommandMessageProcessingAction = new ActionBlock <MessageData>(msg => m_processor.ProcessCommandMessage(msg));
            m_decodedMessageProcessingAction        = new ActionBlock <MessageData>(msg => m_processor.ProcessMessage(msg));

            m_encodeTransform = new TransformBlock <(Node Node, IList <Byte[]> Msg), (TransportProtocol Protocol, ZMessage Msg)>
                                    (msg => (TransportProtocol.TCP, MessageCodec.EncodeMessage(msg.Node.Identity, msg.Msg)));
            m_encodeSignalTransform = new TransformBlock <(Node Node, IList <Byte[]> Msg), (TransportProtocol Protocol, ZMessage Msg)>
                                          (msg => (TransportProtocol.TCP, MessageCodec.EncodeNodeSignalMessage(msg.Node.Identity, msg.Msg)));

            m_sendAction = new ActionBlock <(TransportProtocol Protocol, ZMessage Msg)>(msg =>
            {
                if (msg.Protocol == TransportProtocol.TCP)
                {
                    m_tcpSocketSendAction.Post(msg.Msg);
                }
                //else
                //    m_udpSocketSendAction.Post(msg.Msg);
            });

            m_receiveBuffer.LinkTo(m_decodeTransform);
            m_decodeTransform.LinkTo(m_decodedMessageProcessingAction);
            m_cmdWorker.RecvBuffer.LinkTo(m_decodedCommandMessageProcessingAction);

            m_processor.SendMessageBuffer.LinkTo(m_encodeTransform);
            m_processor.SendSignalBuffer.LinkTo(m_encodeSignalTransform);
            m_processor.SendCommandBuffer.LinkTo(m_cmdWorker.SendBuffer);

            m_encodeTransform.LinkTo(m_sendAction);
            m_encodeSignalTransform.LinkTo(m_sendAction);
        }
コード例 #2
0
        public void ProcessMessage(MessageData message)
        {
            switch (message.Type)
            {
            case MessageType.Common:
                OnNormalMessage();
                return;

            case MessageType.NodeSignal:
                OnNodeSignalMessage();
                return;

            case MessageType.NodeInitialization:
                OnNewNode();
                return;
            }


            void OnNewNode()
            {
                var nodeName = MessageCodec.DecodeNodeInitialization(message.Data);

                //var udpSigWorker = new NodeSignalsWorker(message.Identity, m_signalsProcessor.SendSignalBuffer);
                var tcpSigWorker = new NodeMainTCPSignalWorker(message.Identity, m_signalsProcessor.SendSignalBuffer);
                var cmdSigWorker = new NodeCommandSignalWorker(message.Identity, m_signalsProcessor.SendSignalBuffer);

                var node = new Node(message.Identity,
                                    nodeName,
                                    //udpSigWorker,
                                    tcpSigWorker,
                                    cmdSigWorker);

                m_nodes.Add(message.Identity, node);
                node.OutMessageBuffer.LinkTo(SendMessageBuffer);
                node.CommandOutMessageBuffer.LinkTo(SendCommandBuffer);

                NodeRegistered?.Invoke(this, new NodeRegisteredEventArgs(node));

                node.TCPSocketSignalsWorker.SendNullSignal();
            }

            void OnNodeSignalMessage()
            {
                if (m_nodes.TryGetValue(message.Identity, out var node))
                {
                    m_signalsProcessor.RecvSignalBuffer.Post((                                //(message.Protocol == TransportProtocol.TCP) ?
                                                                 node.TCPSocketSignalsWorker, //:
                                                                 //node.UDPSocketSignalsWorker,
                                                                 message.Data));
                }
                else
                {
                    OnUninitializedMessage();
                }
            }

            void OnNormalMessage()
            {
                if (m_nodes.TryGetValue(message.Identity, out var node))
                {
                    node.InMessageBuffer.Post(message.Data);
                }
                else
                {
                    OnUninitializedMessage();
                }
            }
        }