当前位置:   article > 正文

10-OpenFeign-实现异步调用

10-OpenFeign-实现异步调用

通常我们在使用openfeign发起服务调用时,需要同步等待调用结束。某些场景下,我们需要实现异步调用。

1、使用java8 的 CompletableFuture 异步工具

  1. @Resource
  2. OauthFeign oauthFeign;
  3. @GetMapping("/get")
  4. public Object get() {
  5. CompletableFuture<Object> completableFuture = CompletableFuture.supplyAsync(() -> {
  6. return oauthFeign.openFeignApi();
  7. });
  8. return completableFuture;
  9. }

RequestContextHolder中是将请求信息放入ThreadLocal中的,只能取到同一个线程的数据。

2、使用RequestContextHolder 获取主线程中的header信息

RequestAttributes attributes = RequestContextHolder.getRequestAttributes();

在异步线程内部设置 RequestContextHolder.setRequestAttributes(attributes);

  1. CompletableFuture<T> future1 = CompletableFuture.supplyAsync(() -> {
  2. //openfeign的调用
  3. return feign.remoteCall();
  4. },executor);
  5. CompletableFuture<T> future2 = CompletableFuture.supplyAsync(() -> {
  6. //openfeign的调用
  7. return feign.remoteCall();
  8. },executor);
  9. CompletableFuture.allOf(future1,future2).join();
  10. .....
  1. //获取主线程的请求信息
  2. RequestAttributes attributes = RequestContextHolder.getRequestAttributes();
  3. CompletableFuture<T> future1 = CompletableFuture.supplyAsync(() -> {
  4. //将主线程的请求信息设置到异步线程中,否则会丢失请求上下文,导致调用失败
  5. RequestContextHolder.setRequestAttributes(attributes);
  6. //openfeign的调用
  7. return feign.remoteCall();
  8. },executor);
  9. CompletableFuture<T> future2 = CompletableFuture.supplyAsync(() -> {
  10. //将主线程的请求信息设置到异步线程中,否则会丢失请求上下文,导致调用失败
  11. RequestContextHolder.setRequestAttributes(attributes);
  12. //openfeign的调用
  13. return feign.remoteCall();
  14. },executor);
  15. CompletableFuture.allOf(future1,future2).join();
  16. .....

 

3、全局设置(未验证)

  1. 1. 定义一个Feign RequestInterceptor拦截器:
  2. java
  3. public class RequestContextInterceptor implements RequestInterceptor {
  4. @Override
  5. public void apply(RequestTemplate requestTemplate) {
  6. ServletRequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
  7. if (requestAttributes != null) {
  8. RequestContextHolder.setRequestAttributes(requestAttributes, true);
  9. }
  10. }
  11. }
  12. 2.FeignClient上添加配置,使用该拦截器:
  13. java
  14. @FeignClient(name="hello", configuration = HelloConfiguration.class)
  15. public interface HelloClient {
  16. // ...
  17. }
  18. public class HelloConfiguration {
  19. @Bean
  20. public RequestInterceptor requestContextInterceptor() {
  21. return new RequestContextInterceptor();
  22. }
  23. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/111561
推荐阅读
相关标签
  

闽ICP备14008679号