我使用AsyncHttpClient和Netty一起在微服務之間執行無阻塞的REST調用。我試圖找出一旦Netty工作線程返回到池時如何清除threadLocal值。AsyncHttpClient和Netty - 工作線程正在返回到池的鉤子?
在我的AsyncCompletionHandler onCompleted()和onThrowable()方法(即返回HTTP響應時),我添加了一些threadLocal數據。具體而言,我存儲與請求鏈關聯的ID以幫助關聯服務之間的日誌消息。一旦工作線程完成執行並返回到線程池,我需要清除這個threadLocal數據。但是,我找不到任何鉤子。我認爲創建我自己的覆蓋afterExecute(Runnable r,Throwable t)並通過我的AsyncHttpClientConfig.Builder設置它的ExecutorService是可行的,但我想我誤解了AsyncHttpClient如何使用ExecutorService。只有在首次創建ExecutorService時,纔會在發送/接收HTTP請求/響應的過程中根本不調用beforeExecute(),execute()或afterExecute()。
那麼,有什麼辦法讓我知道什麼時候一個工作線程完成執行並將被返回到threadPool?
爲了記錄在案,這裏是我使用的庫:
<dependency>
<groupId>com.ning</groupId>
<artifactId>async-http-client</artifactId>
<version>1.9.31</version>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.0.32.Final</version>
</dependency>
感謝有關AHC和Netty版本的信息。對穿線行爲感到厭煩;這聽起來像使用threadlocal數據是一個壞主意,一旦我收到一個異步HTTP響應。總的來說,NIO基本上是這樣嗎? –
那麼,一般來說,使用ThreadLocals來存儲長壽命的數據只是爲了不必將它作爲方法參數傳遞,這是一個壞主意。它只適用於你有一個順序的一個線程路徑。非阻塞API爲您提供可以存儲這些數據的回調函數,請參閱AHC的AsyncHandler和ListenableFuture。 –
我同意使用ThreadLocals是次優解決方案;我堅持試圖使我們現有的框架與異步調用一起工作。但它肯定有助於瞭解這種方法的侷限性。 –