java 使用ThreadPoolExecutor 线程池,子线程调用FeignClient时,Token丢失
时间: 2023-07-06 09:39:53 浏览: 183
Java线程池ThreadPoolExecutor原理及使用实例
这个问题可能是因为FeignClient在调用时会新开一个线程,但是这个线程没有继承主线程的ThreadLocal变量,所以导致了Token丢失的问题。解决这个问题可以尝试在ThreadPoolExecutor的execute方法中,手动将主线程的ThreadLocal变量传递给子线程,代码示例如下:
```java
ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);
executor.execute(() -> {
// 在子线程中调用FeignClient时,手动将主线程的ThreadLocal变量传递给子线程
RequestContext context = RequestContext.getCurrentContext();
RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes();
context.set("requestAttributes", requestAttributes);
try {
// 调用FeignClient
// ...
} finally {
context.unset();
}
});
```
在FeignClient中,可以通过RequestContextHolder获取ThreadLocal变量,示例如下:
```java
@Component
public class MyFeignClientInterceptor implements RequestInterceptor {
@Override
public void apply(RequestTemplate requestTemplate) {
RequestContext context = RequestContext.getCurrentContext();
RequestAttributes requestAttributes = (RequestAttributes) context.get("requestAttributes");
ServletRequestAttributes attributes = (ServletRequestAttributes) requestAttributes;
HttpServletRequest request = attributes.getRequest();
// 获取Token等信息
// ...
// 将Token等信息添加到header中
requestTemplate.header("Authorization", token);
}
}
```
这样就可以在子线程中正确地获取到主线程中的ThreadLocal变量,避免了Token丢失的问题。
阅读全文