def unresolve_msg(self, msg): # 转发消息 smart_log('收到消息\r\n %s' % msg.head) if msg.head.direction == DirectionType.ToWebServer: print("转发Web服务的数据包: {}".format(msg)) if msg.head.tag == 2 and msg.head.serverTokenId and web_service_dict[ msg.head.serverTokenId]: # 为某个请求的返回, 并且需要原路返回 web_service_dict[msg.head.serverTokenId]["protocal"].send_msg( msg=msg, use_raw_buf=True) else: optimal_protocal = None min_payload = None for server_token, web_server in web_service_dict.items(): if not min_payload: min_payload = web_server["payload"] optimal_protocal = web_server["protocal"] if min_payload > web_server["payload"]: min_payload = web_server["payload"] optimal_protocal = web_server["protocal"] if optimal_protocal: optimal_protocal.send_msg(msg=msg, use_raw_buf=True) elif msg.head.direction == DirectionType.ToWxServer: print("转发助手服务的数据包: {}".format(msg)) if msg.head.helperToken: # 获取助手指定的wx_helper_server helper_session = HelperSession( helper_token=msg.head.helperToken, helper_server_token=None) helper_session.get_server_token_by_helper_token() helper_server_token = helper_session.helper_server_token if helper_server_token and helper_service_dict.get( helper_server_token.decode()): print("指定助手转发助手服务的数据包: {}".format(msg)) helper_service_dict.get( helper_server_token.decode())["protocal"].send_msg( msg=msg, use_raw_buf=True) else: # TODO 指定服务出现异常 smart_log( "指定服务出现异常, helper_server_token:{}, helper_token:{}". format(helper_server_token, msg.head.helperToken)) helper_session.delete_server_relation_by_helper_token() else: # 未指定相关助手 optimal_protocal = None min_payload = None for server_token, helper_server in helper_service_dict.items(): if not min_payload: min_payload = helper_server["payload"] optimal_protocal = helper_server["protocal"] if min_payload > helper_server["payload"]: min_payload = helper_server["payload"] optimal_protocal = helper_server["protocal"] if optimal_protocal: print("选取最优助手转发助手服务的数据包: {}".format(msg)) optimal_protocal.send_msg(msg=msg, use_raw_buf=True) else: print("未知转发方向的数据包: {}".format(msg))
def remove_from_container(self): smart_log("移除节点 app_id:%d server_token:%s" % (self.service_id, self.server_token_id)) if self in all_node_list: all_node_list.remove(self) if self.server_token_id: if self.service_id == AppId.AppType_HelperServer: del helper_service_dict[self.server_token_id] elif self.service_id == AppId.AppType_WebServer: del web_service_dict[self.server_token_id]
def helper_login(self, msg): """ 管家登录请求 :param msg: :return: """ smart_log('收到管家登录请求, mark={}'.format(msg.head.mark)) from helper.wx_hepler import HelperStart global Wx_Helper_Linker_Protocol helper_thread = HelperStart(mark=msg.head.mark, protocol=Wx_Helper_Linker_Protocol, web_server_token=msg.head.serverTokenId) helper_thread.start()
def send_message_to_wx(self, msg): """ 发送消息到微信 :param msg: :return: """ smart_log('收到发送消息到微信请求') helper_token = msg.head.helperToken msg_type = msg.body.msgType content = msg.body.content to_username_list = msg.body.toUserNameList wx_helper = helper_dict.get(helper_token) if to_username_list and len(to_username_list) > 0: for to_username in to_username_list: wx_helper.web_wx_send_msg(content, to_username)
def on_hub_service_register(self, msg): smart_log("注册:") # 产生服务器的唯一标识 如果服务器注册过 则使用之前的 if msg.head.serverTokenId and len(msg.head.serverTokenId) > 0: server_token_id = msg.head.serverTokenId else: server_token_id = str(uuid.uuid1()) self.server_token_id = server_token_id self.service_id = msg.body.serviceAppId head = WxHead() head.appId = AppId.AppType_ServerSystem head.functionId = FunctionId.ServerSystemServiceRegister if msg.body.serviceAppId == AppId.AppType_HelperServer: print("WxHelperServer 注册到Hub") helper_service_dict[server_token_id] = { "payload": 0, "protocal": self } head.direction = DirectionType.ToWxServer elif msg.body.serviceAppId == AppId.AppType_WebServer: print("WebServer 注册到Hub") web_service_dict[server_token_id] = { "payload": 0, "protocal": self } head.direction = DirectionType.ToWebServer # if msg.body.serviceAppId: # smart_log("注册服务 app_id:%d server_token:%s" % (self.service_id, self.server_token_id)) # for sub_id in msg.body.subScribeFunctionId: # if sub_id not in subscribe_dict: # subscribe_dict[sub_id] = [] # if self not in subscribe_dict[sub_id]: # subscribe_dict[sub_id].append(self) # smart_log("添加订阅 app_id:%d server_token:%s" % (self.service_id, self.server_token_id)) resp = ServiceRegisterResp() resp.response = ResponseInfo(code=ResponseCode.Succeed) resp.serverTokenId = server_token_id self.send_msg(head=head, body=resp)
def send_heartbeat(self): """ 发送心跳包 :return: """ now = datetime.now() if self.last_heartbeat_time and (now - self.last_heartbeat_time ).seconds > HEARTBEAT_MAX_INTERVAL: print('心跳超时,准备重连') smart_log('心跳超时,准备重连') self.task.stop() self.transport.loseConnection() return body = ServerHeartbeatReq() body.payloadCount = 0 self.send_msg_to_hub(app_id=AppId.AppType_ServerSystem, function_id=FunctionId.ServerSystemHeartbeat, body=body, server_token_id=self.serverTokenId)
def on_hub_heartbeat(self, msg): self.last_heartbeat_time = datetime.now() smart_log("心跳 app_id:%d server_token:%s" % (self.service_id, self.server_token_id)) head = WxHead() head.appId = AppId.AppType_ServerSystem head.functionId = FunctionId.ServerSystemHeartbeat head.direction = DirectionType.ToWxServer resp = ServerHeartbeatResp() resp.response = ResponseInfo(code=ResponseCode.Succeed) self.send_msg(head=head, body=resp) # 更新负载 if msg.body.payloadCount: if msg.head.appId == AppId.AppType_HelperServer and helper_service_dict[ msg.head.serverTokenId]: helper_service_dict[ msg.head.serverTokenId]["payload"] = msg.body.payloadCount elif msg.head.appId == AppId.AppType_WebServer and web_service_dict[ msg.head.serverTokenId]: web_service_dict[ msg.head.serverTokenId]["payload"] = msg.body.payloadCount
def on_service_register(self, msg): self.serverTokenId = msg.body.serverTokenId smart_log('收到挂载包 name:%s' % self.serverTokenId) self.last_heartbeat_time = datetime.now() self.task = LoopingCall(self.send_heartbeat) self.task.start(HEARTBEAT_INTERVAL)
def connectionLost(self, reason): smart_log('链接断开') self.remove_from_container()