Beispiel #1
0
    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)
Beispiel #2
0
    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)        
Beispiel #3
0
    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
Beispiel #4
0
    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
Beispiel #5
0
    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.")
Beispiel #6
0
    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
Beispiel #7
0
 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)