java+webflux+resilience4j:触发回退方法的方法的名称

2ledvvac  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(388)

关于java springboot webflux with resilience4j(不是SpringCloud断路器)的小问题。
我有以下直截了当的建议:

@TimeLimiter(name = "methodOne", fallbackMethod = "fallbackMethod")
    public Mono<String> methodOne(@RequestParam(value = "name", defaultValue = "World") String name) {
        return WebClient.builder().baseUrl("http://localhost:8081/serviceBgreeting?name=" + name).build().get().retrieve().bodyToMono(String.class);
    }

    @TimeLimiter(name = "methodTwo", fallbackMethod = "fallbackMethod")
    public Mono<String> methodTwo(@RequestParam(value = "name", defaultValue = "World") String name) {
        return WebClient.builder().baseUrl("http://localhost:8082/anotherMethodTwo?name=" + name).build().get().retrieve().bodyToMono(String.class);
    }

以及一个由所有调用者共享的被调用者fallbackmethod,如下所示:

public Mono<Object> fallBackMethod(Exception exception) {
        System.out.println("For debug purpose, I need to know what is the exact method falling back to this fallback method");
        return //the fallback thing needed;

检索methodone或methodtwo这两个方法中的哪一个实际上是此回退的触发器的最佳方法是什么?
我有1000多个方法使用这种模式,所以我不能只创建1000多个回退方法(就像methodone掉到fallbackone,methodtwo掉到fallbacktwo等等,我不能)
我确信有一个聪明的方法来获取触发回退的方法名。
尝试了stackwalker,它只提供(fallbackmethod、invoke、fallback、lambda$reactornorrorresume$1、onerror等),但没有提供触发回退的方法。
请帮点忙。
谢谢您

j8yoct9x

j8yoct9x1#

你能试着执行这个吗 fallbackMethod 我们正在收集执行调用中可用方法的列表,如果最近的调用方存在,则从堆栈跟踪检查中收集。

Method[] methods = this.getClass().getMethods();
StackTraceElement[] stackTrace = throwable.getStackTrace();
Optional<StackTraceElement> first = Arrays.stream(stackTrace)
                .filter(s -> Arrays.stream(methods).anyMatch(m -> m.getName().equalsIgnoreCase(s.getMethodName())))
                .findFirst();
log.error("Method name Starts here");
first.ifPresent(System.out::println);
log.error("Method name Ends here");

这是在打印类似的东西

in.silentsudo.webapi.services.PaymentOptionService.availablePaymentOptions(PaymentOptionService.java:36)

我们可以从这里提取方法名。
我的来电者就是这样的

@CircuitBreaker(
            name = "payment-option-service-circuit-breaker",
            fallbackMethod = "paymentOptionOnCircuitBreak"
)
public Map<String, List<PaymentOption>> availablePaymentOptions() {
...
}

相关问题