Class AsyncExecutor

java.lang.Object
tech.riemann.nif.support.tiangong.servlet.async.AsyncExecutor

public final class AsyncExecutor extends Object
Servlet 异步请求的工作池与超时调度器,由容器统一装配、统一关闭。

历史实现在 AsyncContextImpl 中以 static final 字段直接创建 Executors.newCachedThreadPool():线程数无界、生命周期不可关闭、溢出无拒绝策略。现改为:

  • 工作线程委托给 WorkerExecutor,沿用 server.tiangong.async-worker-threads 与 prefer-virtual-threads 配置,等待队列有界(async-queue-capacity);
  • 队列打满时 execute(Runnable) 返回 false,由调用方把异步请求按错误路径结束,而不是无限堆积;
  • TiangongWebServer 启动时 configure(WorkerExecutor) 注入, 停止时 shutdown() 取消未触发的超时任务并进入关闭态;工作池本身由容器负责关闭。

未装配时(例如脱离容器的单元测试)会惰性创建一套有界的默认池,行为与装配后一致。进入关闭态后 execute(Runnable) 一律返回 false、schedule(Runnable, long) 返回 null,不再新建线程。

  • Field Details

    • DEFAULT_THREAD_NAME_PREFIX

      public static final String DEFAULT_THREAD_NAME_PREFIX
      默认线程名前缀。
      See Also:
    • DEFAULT_MAX_THREADS

      public static final int DEFAULT_MAX_THREADS
      未显式配置时的最大工作线程数(虚拟线程可用时该值不生效)。
      See Also:
    • DEFAULT_QUEUE_CAPACITY

      public static final int DEFAULT_QUEUE_CAPACITY
      未显式配置时的等待队列容量。
      See Also:
  • Method Details

    • configure

      public static void configure(WorkerExecutor worker)
      注入容器配置好的工作池并解除关闭态;原先由本类创建且仍存活的默认池会被关闭。
    • worker

      public static WorkerExecutor worker()
      Returns:
      当前工作池(未装配时惰性创建有界默认池)
      Throws:
      IllegalStateException - 已关闭且无可用工作池
    • execute

      public static boolean execute(Runnable task)
      提交异步任务。
      Returns:
      已接受返回 true;队列打满或容器已关闭返回 false
    • schedule

      public static ScheduledFuture<?> schedule(Runnable task, long delayMillis)
      注册一个延迟任务(用于 AsyncContext 超时回调)。
      Returns:
      可用于取消的句柄;容器已关闭时返回 null
    • shutdown

      public static void shutdown()
      进入关闭态:取消未触发的超时任务,并释放由本类创建的默认工作池。容器停机时调用。
    • reset

      public static void reset()
      归还到「未装配」状态,供测试隔离使用。
    • isConfigured

      public static boolean isConfigured()
      Returns:
      当前是否已由容器注入工作池
    • isClosed

      public static boolean isClosed()
      Returns:
      当前是否处于关闭态