关于带有Resilience4J的Java SpringBoot Webflux(不是Spring Cloud Circuit Breaker(的小问题。
我有以下简单的方法:
@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多个回退方法。(比如方法一倒一,方法二倒二等等…,我不能(
我确信有一种聪明的方法可以获得触发回退的方法名称。
尝试了StackWalker,它只提供(fallBackMethod、invoke、fallback、lambda$reactorOnErrorResume$1、onError等(,但不提供触发fallback的方法。
请帮我一点忙。
谢谢
您可以尝试从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() {
...
}