@@ -488,11 +488,16 @@ async def _message_handler(self):
488488 async for message in self .websocket :
489489 try :
490490 data = json .loads (message )
491+ message_type = data .get ("action" , "" )
492+ message_data = data .get ("data" )
491493 if self .session_id and self .session_id == data .get ("edge_session" ):
492- await self ._process_message (data )
494+ await self ._process_message (message_type , message_data )
493495 else :
494- logger .trace (f"[MessageProcessor] 收到一条归属 { data .get ('edge_session' )} 的旧消息:{ data } " )
495- logger .debug (f"[MessageProcessor] 跳过了一条归属 { data .get ('edge_session' )} 的旧消息: { data .get ('action' )} " )
496+ if message_type .endswith ("_material" ):
497+ logger .trace (f"[MessageProcessor] 收到一条归属 { data .get ('edge_session' )} 的旧消息:{ data } " )
498+ logger .debug (f"[MessageProcessor] 跳过了一条归属 { data .get ('edge_session' )} 的旧消息: { data .get ('action' )} " )
499+ else :
500+ await self ._process_message (message_type , message_data )
496501 except json .JSONDecodeError :
497502 logger .error (f"[MessageProcessor] Invalid JSON received: { message } " )
498503 except Exception as e :
@@ -558,11 +563,8 @@ async def _send_handler(self):
558563 finally :
559564 logger .debug ("[MessageProcessor] Send handler stopped" )
560565
561- async def _process_message (self , data : Dict [str , Any ]):
566+ async def _process_message (self , message_type : str , message_data : Dict [str , Any ]):
562567 """处理收到的消息"""
563- message_type = data .get ("action" , "" )
564- message_data = data .get ("data" )
565-
566568 logger .debug (f"[MessageProcessor] Processing message: { message_type } " )
567569
568570 try :
@@ -575,16 +577,19 @@ async def _process_message(self, data: Dict[str, Any]):
575577 elif message_type == "cancel_action" or message_type == "cancel_task" :
576578 await self ._handle_cancel_action (message_data )
577579 elif message_type == "add_material" :
580+ # noinspection PyTypeChecker
578581 await self ._handle_resource_tree_update (message_data , "add" )
579582 elif message_type == "update_material" :
583+ # noinspection PyTypeChecker
580584 await self ._handle_resource_tree_update (message_data , "update" )
581585 elif message_type == "remove_material" :
586+ # noinspection PyTypeChecker
582587 await self ._handle_resource_tree_update (message_data , "remove" )
583588 # elif message_type == "session_id":
584589 # self.session_id = message_data.get("session_id")
585590 # logger.info(f"[MessageProcessor] Session ID: {self.session_id}")
586- elif message_type == "request_reload " :
587- await self ._handle_request_reload (message_data )
591+ elif message_type == "request_restart " :
592+ await self ._handle_request_restart (message_data )
588593 else :
589594 logger .debug (f"[MessageProcessor] Unknown message type: { message_type } " )
590595
@@ -894,19 +899,48 @@ def _notify_resource_tree(dev_id, act, item_list):
894899 )
895900 thread .start ()
896901
897- async def _handle_request_reload (self , data : Dict [str , Any ]):
902+ async def _handle_request_restart (self , data : Dict [str , Any ]):
898903 """
899- 处理重载请求
904+ 处理重启请求
900905
901- 当LabGo发送request_reload时,重新发送设备注册信息
906+ 当LabGo发送request_restart时,执行清理并触发重启
902907 """
903908 reason = data .get ("reason" , "unknown" )
904- logger .info (f"[MessageProcessor] Received reload request, reason: { reason } " )
909+ delay = data .get ("delay" , 2 ) # 默认延迟2秒
910+ logger .info (f"[MessageProcessor] Received restart request, reason: { reason } , delay: { delay } s" )
905911
906- # 重新发送host_node_ready信息
912+ # 发送确认消息
907913 if self .websocket_client :
908- self .websocket_client .publish_host_ready ()
909- logger .info ("[MessageProcessor] Re-sent host_node_ready after reload request" )
914+ await self .websocket_client .send_message ({
915+ "action" : "restart_acknowledged" ,
916+ "data" : {"reason" : reason , "delay" : delay }
917+ })
918+
919+ # 设置全局重启标志
920+ import unilabos .app .main as main_module
921+ main_module ._restart_requested = True
922+ main_module ._restart_reason = reason
923+
924+ # 延迟后执行清理
925+ await asyncio .sleep (delay )
926+
927+ # 在新线程中执行清理,避免阻塞当前事件循环
928+ def do_cleanup ():
929+ import time
930+ time .sleep (0.5 ) # 给当前消息处理完成的时间
931+ logger .info (f"[MessageProcessor] Starting cleanup for restart, reason: { reason } " )
932+ try :
933+ from unilabos .app .utils import cleanup_for_restart
934+ if cleanup_for_restart ():
935+ logger .info ("[MessageProcessor] Cleanup successful, main() will restart" )
936+ else :
937+ logger .error ("[MessageProcessor] Cleanup failed" )
938+ except Exception as e :
939+ logger .error (f"[MessageProcessor] Error during cleanup: { e } " )
940+
941+ cleanup_thread = threading .Thread (target = do_cleanup , name = "RestartCleanupThread" , daemon = True )
942+ cleanup_thread .start ()
943+ logger .info (f"[MessageProcessor] Restart cleanup scheduled" )
910944
911945 async def _send_action_state_response (
912946 self , device_id : str , action_name : str , task_id : str , job_id : str , typ : str , free : bool , need_more : int
0 commit comments