2015-04-29 40 views
1

如何指定ThreadFactory來更改調用WebSocketListener的回調(onWebSocketConnectonWebSocketText)的線程名稱?Change Jetty WebSocketListener線程名稱

線程名稱將是我創建服務器對象之前已知的固定名稱。

我嘗試了以下不幸的工作。

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」前綴所有線程的線程名稱,這是寫入日誌並給我一個便捷的過濾/分組方式。

回答

1

Jetty中的ThreadPool和它使用的java Executor最終控制着線程名稱,它們只與線程池本身有關。

此外,WebSocket的生命週期意味着許多不同的線程可以爲該WebSocket激活。因此設置一個名稱並期望它堅持特定的WebSocket端點實例是極不可能的。

如果WebSocket的空閒時間足夠長(以毫秒爲單位),那麼線程會返回到您的Jetty服務器上的其他資源池以供使用。

一旦有需要(比如WebSocket寫入或WebSocket端點有一些內容可以讀取),則從ThreadPool獲得一個新的線程來處理這個新的活動。

另外在碼頭的ThreadPool可以用於很多事情,無關具體ServerConnector端點的處理,也存在需要線程處理的WebSocket其中ServerConnector和端點不復存在關閉通知的情況。沒有適配器,沒有網絡任何東西等。

如果你想篩選你的日誌,不要通過線程名稱,使用適當的日誌框架,如logback,並在日誌上設置其他一些過濾他們自己。 (你甚至可以capture all logging events從所有日誌框架,並將其路由一個日誌文件)

一些選項:

  • 使用MDC/NDC性能。
    • 在WebApp初始化時設置,以將Web應用程序的詳細信息包含在記錄事件中。
    • ServerConnector.configure(Socket)處設置爲在日誌記錄事件中包含連接詳細信息。請求通過自定義過濾器MDC處理,包括要求的細節中
    • 設置(如請求路徑,用戶代理,客戶端IP,用戶名等)
  • Centralized Logging from multiple webapps,路由所有的服務器端日誌記錄,然後Sifted或自定義pattern條目來指示您需要的詳細信息。
  • 即使是上述的一些組合,以滿足您的需求。

總之,如果你的最終目標是與日誌事件一起,或登錄搜索,或登錄排序,或者通常任何與記錄,不通過主題名稱做(這是錯誤的做法)

+0

我知道套接字沒有綁定到單個線程。我只希望池中的所有線程具有相同的名稱,我可以在某處指定一次。我不明白爲什麼Jetty不使用我在服務器的ctor中提供的ThreadPool實現。 (或它是否內部覆蓋名稱?我不知道) – leozilla

+0

請參閱原始問題的編輯 – leozilla

+0

更新的答案解決您的核心關注(即:線程名稱操作是錯誤的方法) –