更改 Jetty WebSocketListener 线程名称

Change Jetty WebSocketListener thread name

我如何指定 ThreadFactory 来更改调用 WebSocketListener 的回调(onWebSocketConnectonWebSocketText)的线程名称?

线程名称将是一个在我创建服务器对象之前已知的固定名称。

我尝试了以下但不幸的是没有用。

jettyServer = new Server(new NamedQueuedThreadPool("MyThreadNamePrefix");

import org.eclipse.jetty.util.thread.QueuedThreadPool;

class NamedQueuedThreadPool extends QueuedThreadPool {
    private final String threadName;

    public NamedQueuedThreadPool(final String threadName) {
        this.threadName = threadName;
    }

    @Override
    protected Thread newThread(final Runnable runnable) {
        Thread t = super.newThread(runnable);
        t.setName(threadName);
        return t;
    }
}

我仍然看到像这样的线程名称:qtp1692017180-191(我猜它代表排队的线程池)

我正在使用 jetty-server-9.2.9

编辑: 对我来说,它不关心哪个线程执行特定的客户端请求,我只希望所有线程都具有相同的名称,我可以在某个地方选择。

例如,我会在所有线程的线程名称前加上 "Adapter/SomeInstanceId",这比写入日志更方便 filtering/grouping.

它使用的 ThreadPool in Jetty, and the java Executor 最终控制线程名称,它们只与线程池本身真正相关。

此外,WebSocket 的生命周期意味着许多不同的线程可以为该 WebSocket 处于活动状态。因此,设置名称并期望它坚持特定的 WebSocket 端点实例是极不可能的。

如果 WebSocket 闲置的时间足够长(以毫秒为单位),那么线程会返回到池中以供 Jetty 服务器上的其他资源使用。

一旦有需要(比如WebSocket写入或WebSocket端点有一些内容要读取),然后从ThreadPool中获取一个新的Thread来处理这个新的activity。

此外 Jetty 中的 ThreadPool 可以用于许多事情,与特定 ServerConnector 端点的处理无关,也有一些情况需要 Thread 来处理 WebSocket 的关闭通知其中 ServerConnector 和端点不再存在。没有适配器,没有网络等等

如果你想过滤你的日志,不要通过线程名称来做,使用合适的日志框架,比如来自所有日志框架的 logback, and setup some other sort of filtering on the logs themselves. (You can even capture all logging events 并将它们路由到一个日志文件)

部分选项:

  • 使用 MDC/NDC 属性。
    • 在 WebApp 初始化时设置,以在日志记录事件中包含 Webapp 详细信息。
    • ServerConnector.configure(Socket) 处设置以在日志记录事件中包含连接详细信息。
    • 在通过自定义 MDC 过滤器处理请求期间进行设置以包括请求详细信息(如请求路径、用户代理、客户端远程 ip、用户名等...)
  • Centralized Logging from multiple webapps, routed all to the Server side logging and then Sifted 或使用自定义 pattern 条目来指示您需要的详细信息。
  • 甚至上述的一些组合以满足您的需要。

简而言之,如果您的最终目标是将日志事件关联在一起,或者日志搜索,或者日志排序,或者通常与日志记录有关的任何事情,请不要通过线程名称来实现(这是错误的方法)