更改 Jetty WebSocketListener 线程名称
Change Jetty WebSocketListener thread name
我如何指定 ThreadFactory
来更改调用 WebSocketListener
的回调(onWebSocketConnect
和 onWebSocketText
)的线程名称?
线程名称将是一个在我创建服务器对象之前已知的固定名称。
我尝试了以下但不幸的是没有用。
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
条目来指示您需要的详细信息。
- 甚至上述的一些组合以满足您的需要。
简而言之,如果您的最终目标是将日志事件关联在一起,或者日志搜索,或者日志排序,或者通常与日志记录有关的任何事情,请不要通过线程名称来实现(这是错误的方法)
我如何指定 ThreadFactory
来更改调用 WebSocketListener
的回调(onWebSocketConnect
和 onWebSocketText
)的线程名称?
线程名称将是一个在我创建服务器对象之前已知的固定名称。
我尝试了以下但不幸的是没有用。
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
条目来指示您需要的详细信息。 - 甚至上述的一些组合以满足您的需要。
简而言之,如果您的最终目标是将日志事件关联在一起,或者日志搜索,或者日志排序,或者通常与日志记录有关的任何事情,请不要通过线程名称来实现(这是错误的方法)