resilience4j上下文传播程序无法传播线程本地值

mf98qq94  于 2021-07-14  发布在  Java
关注(0)|答案(0)|浏览(428)

我正在尝试将我的断路器代码从hystrix迁移到resilience4j。通信是在两个应用程序之间进行的,其中一个是包含java代码中所有resility 4j配置的工件,另一个是直接使用它的微服务应用程序。
有一个requestid,它在微服务中生成,并传播到工件上下文中,在日志中打印出来。使用hystrix时,它工作得非常好,但是自从我转向resilience之后,请求id就变为null。
下面是我对批量头和上下文传播程序的配置:

  1. ThreadPoolBulkheadConfig bulkheadConfig = ThreadPoolBulkheadConfig.custom()
  2. .maxThreadPoolSize(maxThreadPoolSize)
  3. .coreThreadPoolSize(coreThreadPoolSize)
  4. .queueCapacity(queueCapacity)
  5. .contextPropagator(new DummyContextPropagator())
  6. .build();
  7. // Bulk Head Registry
  8. ThreadPoolBulkheadRegistry bulkheadRegistry = ThreadPoolBulkheadRegistry.of(bulkheadConfig);
  9. // Create Bulk Head
  10. ThreadPoolBulkhead bulkhead = bulkheadRegistry.bulkhead(name, bulkheadConfig);

虚拟上下文传播程序:

  1. public class DummyContextPropagator implements ContextPropagator {
  2. private static final Logger log = LoggerFactory.getLogger( DummyContextPropagator.class);
  3. @Override
  4. public Supplier<Optional<Object>> retrieve() {
  5. return () -> (Optional<Object>) get();
  6. }
  7. @Override
  8. public Consumer<Optional<Object>> copy() {
  9. return (t) -> t.ifPresent(e -> {
  10. clear();
  11. put(e);
  12. });
  13. }
  14. @Override
  15. public Consumer<Optional<Object>> clear() {
  16. return (t) -> DummyContextHolder.clear();
  17. }
  18. public static class DummyContextHolder {
  19. private static final ThreadLocal threadLocal = new ThreadLocal();
  20. private DummyContextHolder() {
  21. }
  22. public static void put(Object context) {
  23. if (threadLocal.get() != null) {
  24. clear();
  25. }
  26. threadLocal.set(context);
  27. }
  28. public static void clear() {
  29. if (threadLocal.get() != null) {
  30. threadLocal.set(null);
  31. threadLocal.remove();
  32. }
  33. }
  34. public static Optional<Object> get() {
  35. return Optional.ofNullable(threadLocal.get());
  36. }
  37. }
  38. }

但是,似乎没有什么工作可以让我获得requestid。
我做的每件事都是对的还是有别的方法?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题