def idle(self, total_ready_frames): """ Method: idle Description: 空闲处理函数 Parameter: total_ready_frames: 等待执行的命令的数目 Return: Others: """ socks = dict(self.__poll.poll(1000)) if socks.get(self.__socket) != eipc.POLLIN: return try: msg = self.__socket.recv() except: tracelog.exception("receive data failed.") return oneFrame = AppFrame.serialize_from_str(msg) if oneFrame is None: return #if DEBUG_LOG_IN_MSG is True: # tracelog.debug("Recv:%s" % oneFrame) self.get_app().dispatch_frame_to_duty_worker(oneFrame)
def unregist_name_service(self): """ Method: unregist_name_service Description: 向名字服务中心注销服务 Parameter: 无 Return: Others: """ if self._pid == local_const_def.INVALID_PID: return #按pid注销 frame = AppFrame() frame.set_cmd_code(local_cmd_code.UNREGISTER_NAME_COMMAND) #向MASTER的Monitor注册 frame.set_receiver_pid(self.get_pid("Monitor", local_const_def.MASTER_PID)) req = name_msg_def.AppUnRegisterRequest() req.init_all_attr() req.pid = self._pid req.need_reponse = False frame.add_data(req.serialize()) #不用关心结果 rpc_worker.rpc_request(frame, 2)
def _query_from_nameservice(self): """ Method: _query_from_nameservice Description: 从名字服务查询所有注册信息 Parameter: 无 Return: Others: """ frame = AppFrame() frame.set_cmd_code(local_cmd_code.QUERY_APP_COMMAND) frame.set_receiver_pid(self.get_pid("Monitor", local_const_def.MASTER_PID)) req = name_msg_def.AppQueryRequest() req.init_all_attr() frame.add_data(req.serialize()) ack_frames = rpc_worker.rpc_request(frame, 10) all_app_infos = [] if len(ack_frames)==0: return all_app_infos #这里不需要捕获异常 rep = name_msg_def.AppQueryResponse.deserialize(ack_frames[0].get_data()) if rep.return_code==0: all_app_infos = rep.app_infos return all_app_infos
def _shakehand_with_monitor(self, statflag): """ Method: _shakehand_with_monitor Description: 与monitor握手一次 Parameter: statflag: 握手消息中带的状态 Return: -1: 握手失败 0: monitor返回握手应答,应答中带有stop消息 1: 握手成功 Others: """ if not self._is_need_shake_with_monitor(): return 1 frame = AppFrame() frame.set_cmd_code(local_cmd_code.CMD_SHAKEHAND_WITH_MONITOR) #和本机Monitor握手 frame.set_receiver_pid(self.get_pid("Monitor", local_const_def.ONLYLOCAL_PID)) frame.add_data(self._instance_name) frame.add_data(statflag) ack_frames = rpc_worker.rpc_request(frame, 2) if len(ack_frames) == 0: self.__shakehandl_failed_count += 1 if self.__shakehandl_failed_count >= 3: tracelog.error("shake hand with monitor failed.") self.stop() return -1 self.__shakehandl_failed_count = 0 ack_frame = ack_frames[0] rst = ack_frame.get_data(0) if rst == BasicApp.SHAKEHANDACK_STOP: tracelog.info("receive stop event from monitor.") self.stop() return 0 return 1
def notify_monitor_stop_event(self): """ Method: notify_monitor_stop_event Description: 通知monitor当前进程将要停止了 Parameter: 无 Return: Others: """ if not self._is_need_shake_with_monitor(): return if self.__ipc_send_work is None: return try: frame = AppFrame() frame.set_cmd_code(local_cmd_code.CMD_SHAKEHAND_WITH_MONITOR) frame.add_data(self._instance_name) frame.add_data(BasicApp.SHAKEHAND_STOPPING) frame.set_receiver_pid(self.get_pid("Monitor", local_const_def.ONLYLOCAL_PID)) self.dispatch_frame_to_process_by_pid(frame.get_receiver_pid(), frame) except: tracelog.exception("notify_monitor_stop_event failed.")
def _msg_to_frame(self, url_or_srv_name, msg): """ Method: _msg_to_frame Description: 将AcpMessage装换为AppFrame Parameter: url_or_srv_name: 消息发送者的url msg: AcpMessage消息 Return:AppFrame Others: """ # CallAcpMsg转换为AppFrame frame = AppFrame() frame.set_cmd_code(msg.get_cmd_code()) frame.set_sender_pid(local_const_def.CALLACPSRV_PID) custom_bytes = self._struct.pack(msg.get_msg_id()) + url_or_srv_name frame.set_custom_bytes(custom_bytes) frame.add_data(msg.get_data()) return frame
def send_ack(self, frame, datas): """ Method: send_ack Description:发送应答消息 Parameter: frame: AppFrame实例,对应的请求消息 datas: 应答消息体,字符串或二进制数据,可以是一个字符串或二进制数据的列表 Return: Others: """ frame_ack = AppFrame() frame_ack.prepare_for_ack(frame) if isinstance(datas, list) or isinstance(datas, tuple): for data in datas: frame_ack.add_data(data) else: frame_ack.add_data(datas) self.dispatch_frame_to_process_by_pid(frame.get_sender_pid(), frame_ack)