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

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

我正在尝试将我的断路器代码从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。
我做的每件事都是对的还是有别的方法?

暂无答案!

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

相关问题