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); }
public FFRpc Reg <MSG_TYPE, RET_TYPE>(TUserFunc <MSG_TYPE, RET_TYPE> funcUser) where MSG_TYPE : Thrift.Protocol.TBase, new() where RET_TYPE : Thrift.Protocol.TBase, new() { MSG_TYPE tmpData = new MSG_TYPE(); string msgname = Type2Name(tmpData); FFLog.Trace(string.Format("ffrpc.FFRpc Reg....msgname={0}", msgname)); m_dictFuncs[msgname] = (BrokerRouteMsgReq reqMsg) => { MSG_TYPE msgData = new MSG_TYPE(); FFNet.DecodeMsg(msgData, reqMsg.Body); RET_TYPE retMsg = funcUser(msgData); if (reqMsg.Callback_id != 0) { reqMsg.Dest_node_id = reqMsg.From_node_id; reqMsg.Dest_service_name = ""; reqMsg.Body = Util.Byte2String(FFNet.EncodeMsg(retMsg)); SendToDestNode(reqMsg); } }; return(this); }
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); } }
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); } }