Class WebsocketManager

java.lang.Object
io.github.theword.queqiao.core.utils.WebsocketManager

public class WebsocketManager extends Object
WebSocket 生命周期管理器

所有权模型(单向、不允许跨层 shutdown):

 WebsocketManager
     owns  →  reconnectScheduler(共享重连调度器)
 WsClient
     owns  →  reconnectFuture / generation / retry state / reconnectInProgress
 Java-WebSocket
     owns  →  socket / read thread / write thread / connectionLostChecker
 

调度器在构造阶段创建(ScheduledThreadPoolExecutor 的 core 线程在首次提交任务时才启动, 因此即使未启用 Client 也无实际线程开销),只在 stop(int, String, Object) 这一永久销毁路径 关闭;stopClients() / restartClients() 绝不触碰它。

Since:
0.6.11
  • Constructor Details

    • WebsocketManager

      public WebsocketManager(org.slf4j.Logger logger, com.google.gson.Gson gson, HandleCommandReturnMessageService handleCommandReturnMessageService, HandleProtocolMessage handleProtocolMessage, Config config)
      构造 WebSocket 生命周期管理器
      Parameters:
      logger - 日志实现
      gson - Gson 实例
      handleCommandReturnMessageService - 命令返回消息实现
      handleProtocolMessage - 协议分发入口(由 QueQiaoRuntime 创建并注入)
      config - 配置快照(由 QueQiaoRuntime 注入)
  • Method Details

    • getWsClientList

      public List<WsClient> getWsClientList()
    • getWsServer

      public WsServer getWsServer()
    • start

      public void start(Object commandReturner)
      启动(幂等)

      重复调用不会创建第二套 Client,也不会创建第二个调度器。

      Parameters:
      commandReturner - 命令执行者,可为 null
    • stop

      public void stop(int code, String reason, Object commandReturner)
      永久停止(幂等)

      这是唯一会销毁共享调度器的路径。

      Parameters:
      code - 关闭码
      reason - 关闭原因
      commandReturner - 命令执行者,可为 null
    • restart

      public void restart(Config newConfig, Object commandReturner)
      重载(保留共享调度器)

      先替换配置快照,再按新配置重建 Client 与 Server。 不允许 stop scheduler 后再复用已关闭的 scheduler。

      Parameters:
      newConfig - 新的配置快照(由 QueQiaoRuntime 在 reload 时加载)
      commandReturner - 命令执行者,可为 null
    • sendEvent

      public void sendEvent(BaseEvent event)
      分发事件到所有接收方

      线程模型:序列化与分发都在调用线程上同步完成。 这是有意为之——实测单次事件序列化约 1~2.3 µs,每 tick 100 个事件仅占 50 ms tick 预算的 0.5% 左右;而改为异步会引入"队列溢出如何处理"与 "同一连接内事件乱序/丢失"两个更难接受的问题。

      低成本守卫:先取接收方快照,若既无 Client 也无 Server,直接返回, 不做无意义的序列化。

      Parameters:
      event - 事件