我使用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是次优解决方案;我坚持试图使我们现有的框架与异步调用一起工作。但它肯定有助于了解这种方法的局限性。 –