Exemple #1
0
        public bool Call <MSG_TYPE, RET_TYPE>(string strServiceName, MSG_TYPE msgData, TCallBack <RET_TYPE> callback)
            where MSG_TYPE : Thrift.Protocol.TBase, new()
            where RET_TYPE : Thrift.Protocol.TBase, new()
        {
            if (!m_brokerData.Service2node_id.ContainsKey(strServiceName))
            {
                FFLog.Trace(string.Format("ffrpc.Call servervice:{0} not exist", strServiceName));
                RET_TYPE retMsg = new RET_TYPE();
                callback(retMsg);
                return(false);
            }
            BrokerRouteMsgReq reqMsg = new BrokerRouteMsgReq()
            {
                Callback_id = 0, Err_info = ""
            };

            reqMsg.Dest_node_id      = m_brokerData.Service2node_id[strServiceName];
            reqMsg.Dest_service_name = strServiceName;
            reqMsg.Body          = Util.Byte2String(FFNet.EncodeMsg(msgData));
            reqMsg.Dest_msg_name = Type2Name(msgData);
            reqMsg.Callback_id   = ++m_nIDGenerator;
            m_dictCallBack[reqMsg.Callback_id] = (BrokerRouteMsgReq dataMsg) =>
            {
                RET_TYPE retMsg = new RET_TYPE();
                FFNet.DecodeMsg(retMsg, dataMsg.Body);
                callback(retMsg);
            };
            SendToDestNode(reqMsg);
            return(true);
        }
Exemple #2
0
        public void HandleMsg(IFFSocket ffsocket, UInt16 cmd, byte[] strMsg)
        {
            //FFLog.Trace(string.Format("FFBroker handleMsg....{0}, {1} [{2}]", cmd, strMsg.Length, System.Threading.Thread.CurrentThread.ManagedThreadId.ToString()));
            try
            {
                switch ((FFRPC_CMD)cmd)
                {
                case FFRPC_CMD.REGISTER_TO_BROKER_REQ:
                {
                    RegisterToBrokerReq reqMsg = new RegisterToBrokerReq();
                    FFNet.DecodeMsg(reqMsg, strMsg);
                    FFLog.Trace(string.Format("FFBroker handleMsg.REGISTER_TO_BROKER_REQ....{0}, {1}", reqMsg.Node_type, reqMsg.Service_name));
                    if (FFRPC_NODE_TYPE.RPC_NODE == (FFRPC_NODE_TYPE)reqMsg.Node_type)
                    {
                        if (m_brokerData.Service2node_id.ContainsKey(reqMsg.Service_name))
                        {
                            FFLog.Error(string.Format("FFBroker handleMsg servicename exist....{0}, {1}", reqMsg.Node_type, reqMsg.Service_name));
                            ffsocket.Close();
                            return;
                        }
                        Int64 nNodeID = allocNodeId();
                        m_dictSockets[nNodeID] = ffsocket;
                        m_brokerData.Service2node_id[reqMsg.Service_name] = nNodeID;
                        m_brokerData.Node_id = nNodeID;
                        SyncNodeInfo(m_brokerData, ffsocket);        //!广播给所有的子节点
                    }
                } break;

                case FFRPC_CMD.BROKER_ROUTE_MSG:
                {
                    BrokerRouteMsgReq reqMsg = new BrokerRouteMsgReq();
                    FFNet.DecodeMsg(reqMsg, strMsg);
                    FFLog.Trace(string.Format("FFBroker.BROKER_ROUTE_MSG service={0},func={1} Callback={2}",
                                              reqMsg.Dest_service_name, reqMsg.Dest_msg_name, reqMsg.Callback_id));
                    if (!m_dictSockets.ContainsKey(reqMsg.Dest_node_id))
                    {
                        return;
                    }
                    IFFSocket destSocket = m_dictSockets[reqMsg.Dest_node_id];
                    FFNet.SendMsg(destSocket, (UInt16)FFRPC_CMD.BROKER_TO_CLIENT_MSG, reqMsg);
                } break;

                default: break;
                }
            }
            catch (Exception ex)
            {
                FFLog.Error("FFBroker.Error:" + ex.Message);
            }
        }
Exemple #3
0
        public bool Call <MSG_TYPE>(string strServiceName, MSG_TYPE msgData)
            where MSG_TYPE : Thrift.Protocol.TBase, new()
        {
            if (!m_brokerData.Service2node_id.ContainsKey(strServiceName))
            {
                FFLog.Trace(string.Format("ffrpc.Call servervice:{0} not exist", strServiceName));
                return(false);
            }
            BrokerRouteMsgReq reqMsg = new BrokerRouteMsgReq()
            {
                Callback_id = 0, Err_info = ""
            };

            reqMsg.Dest_node_id      = m_brokerData.Service2node_id[strServiceName];
            reqMsg.Dest_service_name = strServiceName;
            reqMsg.Body          = Util.Byte2String(FFNet.EncodeMsg(msgData));
            reqMsg.Dest_msg_name = Type2Name(msgData);
            SendToDestNode(reqMsg);
            return(true);
        }
Exemple #4
0
 public void SendToDestNode(BrokerRouteMsgReq retMsg)
 {
     retMsg.From_node_id = m_nNodeID;
     FFNet.SendMsg(m_socketBroker, (UInt16)FFRPC_CMD.BROKER_ROUTE_MSG, retMsg);
 }
Exemple #5
0
        public void HandleMsg(IFFSocket ffsocket, UInt16 cmd, string strMsg)
        {
            //FFLog.Trace(string.Format("ffrpc.FFRpc handleMsg....{0}, {1} [{2}]", cmd, strMsg.Length, System.Threading.Thread.CurrentThread.ManagedThreadId.ToString()));
            try
            {
                switch ((FFRPC_CMD)cmd)
                {
                case FFRPC_CMD.REGISTER_TO_BROKER_RET:
                {
                    FFNet.DecodeMsg(m_brokerData, strMsg);
                    FFLog.Trace(string.Format("ffrpc.handleMsg..REGISTER_TO_BROKER_RET..{0}, {1}", m_brokerData.Node_id, m_brokerData.Register_flag));
                    if (m_brokerData.Register_flag == 1)
                    {
                        m_nNodeID = m_brokerData.Node_id;        //! -1表示注册失败,0表示同步消息,1表示注册成功
                    }
                } break;

                case FFRPC_CMD.BROKER_TO_CLIENT_MSG:
                {
                    BrokerRouteMsgReq reqMsg = new BrokerRouteMsgReq();
                    FFNet.DecodeMsg(reqMsg, strMsg);
                    FFLog.Trace(string.Format("ffrpc.BROKER_TO_CLIENT_MSG msgname={0}", reqMsg.Dest_msg_name));
                    if (reqMsg.Err_info.Length > 0)
                    {
                        FFLog.Error(string.Format("FFRpc::handleRpcCallMsg error={0}", reqMsg.Err_info));
                        if (reqMsg.Callback_id == 0)
                        {
                            return;
                        }
                    }
                    try
                    {
                        if (reqMsg.Dest_service_name.Length > 0)
                        {
                            if (!m_dictFuncs.ContainsKey(reqMsg.Dest_msg_name))
                            {
                                reqMsg.Err_info = "interface named " + reqMsg.Dest_msg_name + " not found in rpc";
                                FFLog.Error(string.Format("FFRpc::handleRpcCallMsg error={0}", reqMsg.Err_info));
                                reqMsg.Dest_node_id      = reqMsg.From_node_id;
                                reqMsg.Dest_service_name = "";
                                SendToDestNode(reqMsg);
                                return;
                            }
                            FFRpcFunc destFunc = m_dictFuncs[reqMsg.Dest_msg_name];
                            destFunc(reqMsg);
                        }
                        else
                        {
                            if (!m_dictCallBack.ContainsKey(reqMsg.Callback_id))
                            {
                                return;
                            }
                            FFRpcFunc destFunc = m_dictCallBack[reqMsg.Callback_id];
                            destFunc(reqMsg);
                        }
                    }
                    catch (Exception ex)
                    {
                        FFLog.Error("ffrpc handleMsg" + ex.Message);
                    }
                }
                break;

                default:
                    break;
                }
            }
            catch (Exception ex)
            {
                FFLog.Error("ffprc.Error:" + ex.Message);
            }
        }