我正在尝试将我的断路器代码从hystrix迁移到resilience4j。通信是在两个应用程序之间进行的,其中一个是包含java代码中所有resility 4j配置的工件,另一个是直接使用它的微服务应用程序。
有一个requestid,它在微服务中生成,并传播到工件上下文中,在日志中打印出来。使用hystrix时,它工作得非常好,但是自从我转向resilience之后,请求id就变为null。
下面是我对批量头和上下文传播程序的配置:
ThreadPoolBulkheadConfig bulkheadConfig = ThreadPoolBulkheadConfig.custom()
.maxThreadPoolSize(maxThreadPoolSize)
.coreThreadPoolSize(coreThreadPoolSize)
.queueCapacity(queueCapacity)
.contextPropagator(new DummyContextPropagator())
.build();
// Bulk Head Registry
ThreadPoolBulkheadRegistry bulkheadRegistry = ThreadPoolBulkheadRegistry.of(bulkheadConfig);
// Create Bulk Head
ThreadPoolBulkhead bulkhead = bulkheadRegistry.bulkhead(name, bulkheadConfig);
虚拟上下文传播程序:
public class DummyContextPropagator implements ContextPropagator {
private static final Logger log = LoggerFactory.getLogger( DummyContextPropagator.class);
@Override
public Supplier<Optional<Object>> retrieve() {
return () -> (Optional<Object>) get();
}
@Override
public Consumer<Optional<Object>> copy() {
return (t) -> t.ifPresent(e -> {
clear();
put(e);
});
}
@Override
public Consumer<Optional<Object>> clear() {
return (t) -> DummyContextHolder.clear();
}
public static class DummyContextHolder {
private static final ThreadLocal threadLocal = new ThreadLocal();
private DummyContextHolder() {
}
public static void put(Object context) {
if (threadLocal.get() != null) {
clear();
}
threadLocal.set(context);
}
public static void clear() {
if (threadLocal.get() != null) {
threadLocal.set(null);
threadLocal.remove();
}
}
public static Optional<Object> get() {
return Optional.ofNullable(threadLocal.get());
}
}
}
但是,似乎没有什么工作可以让我获得requestid。
我做的每件事都是对的还是有别的方法?
暂无答案!
目前还没有任何答案,快来回答吧!