AsyncHttpClient和Netty - 工作线程返回池的钩子?

时间:2016-04-17 17:19:56

标签: java netty asynchttpclient

我使用AsyncHttpClient和Netty在微服务之间执行非阻塞REST调用。我试图找出一旦Netty工作线程返回池后如何清除threadLocal值。

在我的AsyncCompletionHandler onCompleted()和onThrowable()方法中(即返回HTTP响应时),我添加了一些threadLocal数据。具体来说,我存储与请求链关联的ID,以帮助关联服务之间的日志消息。一旦工作线程完成执行并返回到线程池,我需要清除此threadLocal数据。但是,我无法找到任何钩子。

我认为创建我自己的ExecutorService会覆盖afterExecute(Runnable r,Throwable t)并通过我的AsyncHttpClientConfig.Builder设置它会起作用,但我认为我误解了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 个答案:

答案 0 :(得分:1)

首先,您的AHC和Netty版本未对齐。 AHC1以Netty 3为目标,而AHC2以Netty 4为目标。

然后,不要试图这样做。线程不会返回到池

线程同时与多个套接字相关联,并且响应可以跨越多个TCP帧。