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); }
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(); } } }