diff --git a/app/core/websocket/manager.py b/app/core/websocket/manager.py index d04f5b5..c1e54d3 100644 --- a/app/core/websocket/manager.py +++ b/app/core/websocket/manager.py @@ -87,7 +87,6 @@ class WebSocketManager: if channel_name not in self._channels: channel = WebSocketChannel(channel_name, max_size) self._channels[channel_name] = channel - await channel.connect() logger.info(f"WebSocket管理器创建Channel: {channel_name}") # 创建适配器 @@ -124,13 +123,34 @@ class WebSocketManager: if adapter_key not in self._adapters: adapter = WebSocketAdapter(client, outbound_channel, inbound_channel) self._adapters[adapter_key] = adapter - await adapter.start() logger.info(f"WebSocket管理器创建适配器: {adapter_key}") except Exception as e: logger.error(f"WebSocket管理器创建客户端适配器失败: {client_name} - {e}") raise + async def _start_client_channels(self, client_name: str): + """启动客户端的所有Channel和适配器 + + 单一职责:只负责启动Channel和适配器,不处理业务逻辑 + """ + try: + # 启动客户端的所有Channel + client_channels = self.get_client_channels(client_name) + for channel_name, channel in client_channels.items(): + await channel.connect() + logger.info(f"WebSocket管理器启动Channel: {channel_name}") + + # 启动客户端的所有适配器 + client_adapters = self.get_client_adapters(client_name) + for adapter_key, adapter in client_adapters.items(): + await adapter.start() + logger.info(f"WebSocket管理器启动适配器: {adapter_key}") + + except Exception as e: + logger.error(f"WebSocket管理器启动客户端Channel失败: {client_name} - {e}") + raise + async def _start_heartbeat_task(self, client_name: str, heartbeat_interval: int): """启动心跳任务 @@ -283,18 +303,31 @@ class WebSocketManager: logger.error(f"WebSocket客户端 {name} 不存在") return False - # 连接客户端 - success = await client.connect() - - # 如果连接成功,启动心跳任务 - if success and hasattr(client, 'heartbeat_interval'): - try: - await self._start_heartbeat_task(name, client.heartbeat_interval) - logger.info(f"WebSocket管理器连接成功后启动心跳任务: {name}") - except Exception as e: - logger.error(f"心跳任务启动失败: {name} - {e}") - - return success + try: + # 先连接WebSocket客户端 + success = await client.connect() + + if success: + # 连接成功后再启动客户端的所有Channel和适配器 + await self._start_client_channels(name) + + # 最后启动心跳任务 + if hasattr(client, 'heartbeat_interval'): + try: + await self._start_heartbeat_task(name, client.heartbeat_interval) + logger.info(f"WebSocket管理器连接成功后启动心跳任务: {name}") + except Exception as e: + logger.error(f"心跳任务启动失败: {name} - {e}") + + logger.info(f"WebSocket管理器客户端连接成功: {name}") + else: + logger.error(f"WebSocket客户端连接失败: {name}") + + return success + + except Exception as e: + logger.error(f"WebSocket管理器连接客户端失败: {name} - {e}") + return False async def disconnect_client(self, name: str) -> bool: """断开指定客户端"""