2016-04-17 103 views
1

我使用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> 

回答

1

首先,你的AHC和Netty的版本不對齊。 AHC1以Netty 3爲目標,而AHC2以Netty 4爲目標。

然後,不要試圖做到這一點。線程不會返回到池中

線程同時與多個套接字關聯,響應可跨越多個TCP幀。

+0

感謝有關AHC和Netty版本的信息。對穿線行爲感到厭煩;這聽起來像使用threadlocal數據是一個壞主意,一旦我收到一個異步HTTP響應。總的來說,NIO基本上是這樣嗎? –

+0

那麼,一般來說,使用ThreadLocals來存儲長壽命的數據只是爲了不必將它作爲方法參數傳遞,這是一個壞主意。它只適用於你有一個順序的一個線程路徑。非阻塞API爲您提供可以存儲這些數據的回調函數,請參閱AHC的AsyncHandler和ListenableFuture。 –

+0

我同意使用ThreadLocals是次優解決方案;我堅持試圖使我們現有的框架與異步調用一起工作。但它肯定有助於瞭解這種方法的侷限性。 –

相關問題