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

相关问题