更改Jetty WebSocketListener线程名称
如何指定更改Jetty WebSocketListener线程名称,jetty,jetty-9,Jetty,Jetty 9,如何指定ThreadFactory来更改调用WebSocketListener的回调(onWebSocketConnect和onWebSocketText)的线程名称 线程名称将是在创建服务器对象之前已知的固定名称 我尝试了以下方法,但不幸的是没有成功 jettyServer=新服务器(新名称dQueuedThreadPool(“MyThreadNamePrefix”); 导入org.eclipse.jetty.util.thread.QueuedThreadPool; 类NamedQueued
ThreadFactory
来更改调用WebSocketListener
的回调(onWebSocketConnect
和onWebSocketText
)的线程名称
线程名称将是在创建服务器对象之前已知的固定名称
我尝试了以下方法,但不幸的是没有成功
jettyServer=新服务器(新名称dQueuedThreadPool(“MyThreadNamePrefix”);
导入org.eclipse.jetty.util.thread.QueuedThreadPool;
类NamedQueuedThreadPool扩展了QueuedThreadPool{
私有最终字符串threadName;
public NamedQueuedThreadPool(最终字符串threadName){
this.threadName=threadName;
}
@凌驾
受保护线程newThread(最终可运行可运行){
线程t=super.newThread(可运行);
t、 setName(threadName);
返回t;
}
}
我仍然看到线程名称,如:qtp1692017180-191
(我猜它代表排队线程池)
我使用的是jetty-server-9.2.9
编辑:
对我来说,它不关心哪个线程执行特定的客户机请求,我只希望所有线程都有相同的名称,我可以在某处选择
例如,我会在所有线程的线程名前加上“Adapter/SomeInstanceId”,这会写入日志,并为我提供一种方便的筛选/分组方法。Jetty中的java和它使用的java最终控制线程名,它们只与线程池本身相关
此外,WebSocket的生存期意味着该WebSocket可以有许多不同的线程处于活动状态。因此,设置名称并期望其粘附到特定的WebSocket端点实例是非常不可能的
如果WebSocket空闲的时间足够长(以毫秒为单位),那么线程将返回池中,供Jetty服务器上的其他资源使用
一旦有需要(比如WebSocket写入或WebSocket端点有一些内容要读取),就从ThreadPool获取一个新线程来处理这个新活动
Jetty中的ThreadPool
也可以用于许多事情,与特定ServerConnector
端点的处理无关。在某些情况下,当ServerConnector
和端点不再存在时,还需要线程来处理WebSocket的关闭通知。没有适配器,没有网络任何东西,例如tc
如果你想过滤日志,不要通过线程名,使用一个合适的日志框架,比如,并在日志本身上设置一些其他类型的过滤。(你甚至可以从所有日志框架将它们路由到一个日志文件)
一些选择:
- 使用属性。
- 在WebApp初始化时设置,以在日志记录事件中包含WebApp详细信息
- 在上设置,以在日志记录事件中包括连接详细信息
- 在请求处理期间通过自定义MDC筛选器进行设置,以包括请求详细信息(如请求路径、用户代理、客户端远程ip、用户名等)
- ,将所有内容路由到服务器端日志记录,然后或使用自定义
模式
条目指示所需的详细信息
- 甚至是上述的一些组合,以满足您的需要
简而言之,如果您的最终目标是将日志事件关联在一起,或者日志搜索,或者日志排序,或者通常与日志有关,那么不要通过线程名称来实现(这是错误的方法)我知道套接字不绑定到单个线程。我只希望池中的所有线程都具有相同的名称,我可以在某个地方指定一次。我不明白Jetty为什么不使用我在服务器的ctor中提供的线程池实现。(或者它会在内部覆盖该名称??我不知道)更新答案以解决您的核心问题(即:线程名称操纵是错误的方法)