FeignHolder.java 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. package jnpf.utils;
  2. import jnpf.util.ThreadPoolExecutorUtil;
  3. import lombok.extern.slf4j.Slf4j;
  4. import org.springframework.stereotype.Component;
  5. import java.util.Map;
  6. import java.util.TreeMap;
  7. import java.util.concurrent.Future;
  8. import java.util.function.Supplier;
  9. /**
  10. * 异步FEIGN请求, 把当前REQUEST的HEADER存入新线程中, 在新线程中调用feign请求, FeignConfig 中取当前headers发送到新服务
  11. * 使用方式:
  12. * 1、直接调用set设置Header, Feign请求全部调用完之后调用clear清除线程变量
  13. * 2、调用asyncFeign、sendFeign 调用完后自动清除线程变量
  14. */
  15. //@ConditionalOnBean(ThreadPoolTaskExecutor.class)
  16. @Component
  17. @Slf4j
  18. public class FeignHolder {
  19. private static ThreadLocal<Map<String, String>> feignHeader = new ThreadLocal<>();
  20. public static void set(Map<String, String> headers){
  21. TreeMap map = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
  22. map.putAll(headers);
  23. feignHeader.set(map);
  24. }
  25. public static Map<String, String> get(){
  26. return feignHeader.get();
  27. }
  28. public static void clear(){
  29. feignHeader.remove();
  30. }
  31. /**
  32. * Async异步发送请求, 完成后清空线程变量
  33. *
  34. * @param headers
  35. * @param supplier
  36. * @return
  37. */
  38. public static Future<?> asyncFeign(Map<String, String> headers, Supplier supplier){
  39. return ThreadPoolExecutorUtil.getExecutor().submit(()-> sendFeign(headers, supplier));
  40. }
  41. /**
  42. * 同步发送请求, 完成后清空线程变量
  43. * @param headers
  44. * @param supplier
  45. */
  46. public static <R> R sendFeign(Map<String, String> headers, Supplier<R> supplier){
  47. try{
  48. set(headers);
  49. return supplier.get();
  50. }catch(Exception e){
  51. log.error("同步发送Feign请求失败", e);
  52. return null;
  53. }finally{
  54. clear();
  55. }
  56. }
  57. }