Java Resilience4j重试-记录来自客户端的重试尝试?

Java Resilience4j重试-记录来自客户端的重试尝试?,java,spring-webflux,resilience4j,Java,Spring Webflux,Resilience4j,是否可以使用resilience4j在客户端记录重试尝试 可能通过某种配置或设置 目前,我正在使用resilience4j和Spring boot Webflux基于注释的 这是伟大的工作,该项目是惊人的 当我们将服务器日志放在服务器端时,为了查看由于重试(我们记录时间、客户端IP、请求ID等)而进行了相同的http调用,我可以拥有客户端日志吗 我希望看到类似“Resilience4j-客户端:第一次尝试因某些异常而失败,第二次尝试因某些异常而失败,第三次尝试成功!” 差不多吧。是否有一个属性,

是否可以使用resilience4j在客户端记录重试尝试

可能通过某种配置或设置

目前,我正在使用resilience4j和Spring boot Webflux基于注释的

这是伟大的工作,该项目是惊人的

当我们将服务器日志放在服务器端时,为了查看由于重试(我们记录时间、客户端IP、请求ID等)而进行了相同的http调用,我可以拥有客户端日志吗

我希望看到类似“Resilience4j-客户端:第一次尝试因某些异常而失败,第二次尝试因某些异常而失败,第三次尝试成功!”

差不多吧。是否有一个属性,一些配置,一些设置,可以帮助轻松地做到这一点,请?没有添加太多的锅炉代码

@RestController
public class TestController {

    private final WebClient webClient;

    public TestController(WebClient.Builder webClientBuilder) {
        this.webClient = webClientBuilder.baseUrl("http://localhost:8443/serviceBgreeting").build();
    }

    @GetMapping("/greeting")
    public Mono<String> greeting() {
        System.out.println("Greeting method is invoked ");
        return someRestCall();
    }

    @Retry(name = "greetingRetry")
    public Mono<String> someRestCall() {
        return this.webClient.get().retrieve().bodyToMono(String.class);
    }

}
@RestController
公共类测试控制器{
私人最终网络客户网络客户;
公共测试控制器(WebClient.Builder webClientBuilder){
this.webClient=webClientBuilder.baseUrl(“http://localhost:8443/serviceBgreetingbuild();
}
@GetMapping(“/greeting”)
公共问候语(){
System.out.println(“调用了问候方法”);
返回someRestCall();
}
@重试(name=“greetingRetry”)
公共调用{
返回此.webClient.get().retrieve().bodytomino(String.class);
}
}

谢谢你

如果你在谷歌上搜索“resilience4j重试示例日志记录”,网上似乎有很多关于这方面的信息。我发现这是一个潜在的解决方案:

RetryConfig config = RetryConfig.ofDefaults();
RetryRegistry registry = RetryRegistry.of(config);
Retry retry = registry.retry("flightSearchService", config);

...

Retry.EventPublisher publisher = retry.getEventPublisher();
publisher.onRetry(event -> System.out.println(event.toString()));

您可以在其中注册回调以在重试时获取事件。这来自“https://reflectoring.io/retry-with-resilience4j“

如果您在谷歌上搜索“resilience4j重试示例日志记录”,web上似乎有很多关于此的信息。”。我发现这是一个潜在的解决方案:

RetryConfig config = RetryConfig.ofDefaults();
RetryRegistry registry = RetryRegistry.of(config);
Retry retry = registry.retry("flightSearchService", config);

...

Retry.EventPublisher publisher = retry.getEventPublisher();
publisher.onRetry(event -> System.out.println(event.toString()));
您可以在其中注册回调以在重试时获取事件。这来自“https://reflectoring.io/retry-with-resilience4j“

幸运的是(或不幸的是)有一个未记录的功能:)

您可以添加RegistryEventConsumer Bean,以便将事件使用者添加到任何重试实例

    @Bean
    public RegistryEventConsumer<Retry> myRetryRegistryEventConsumer() {

        return new RegistryEventConsumer<Retry>() {
            @Override
            public void onEntryAddedEvent(EntryAddedEvent<Retry> entryAddedEvent) {
                entryAddedEvent.getAddedEntry().getEventPublisher()
                   .onEvent(event -> LOG.info(event.toString()));
            }

            @Override
            public void onEntryRemovedEvent(EntryRemovedEvent<Retry> entryRemoveEvent) {

            }

            @Override
            public void onEntryReplacedEvent(EntryReplacedEvent<Retry> entryReplacedEvent) {

            }
        };
    }
幸运的是(或不幸的是)有一个未记录的特性:)

您可以添加RegistryEventConsumer Bean,以便将事件使用者添加到任何重试实例

    @Bean
    public RegistryEventConsumer<Retry> myRetryRegistryEventConsumer() {

        return new RegistryEventConsumer<Retry>() {
            @Override
            public void onEntryAddedEvent(EntryAddedEvent<Retry> entryAddedEvent) {
                entryAddedEvent.getAddedEntry().getEventPublisher()
                   .onEvent(event -> LOG.info(event.toString()));
            }

            @Override
            public void onEntryRemovedEvent(EntryRemovedEvent<Retry> entryRemoveEvent) {

            }

            @Override
            public void onEntryReplacedEvent(EntryReplacedEvent<Retry> entryReplacedEvent) {

            }
        };
    }

配置了
application.properties
,并使用
@Retry
注释,我成功地获得了一些输出

resilience4j.retry.instances.myRetry.maxAttempts=3
resilience4j.retry.instances.myRetry.waitDuration=1s
resilience4j.retry.instances.myRetry.enableExponentialBackoff=true
resilience4j.retry.instances.myRetry.exponentialBackoffMultiplier=2
resilience4j.retry.instances.myRetry.retryExceptions[0]=java.lang.Exception
import org.slf4j.Logger;
导入org.slf4j.LoggerFactory;
导入org.springframework.stereotype.Service;
导入io.github.resilience4j.retry.RetryRegistry;
导入io.github.resilience4j.retry.annotation.retry;
@服务
公共类MyService{
私有静态最终记录器LOG=LoggerFactory.getLogger(MyService.class);
公共MyService(RetryRegistry RetryRegistry){
//全部
retryRegistry.getAllRetries()
.forEach(重试->重试
.getEventPublisher()
.onRetry(事件->日志.info(“{}”,事件))
);
//还是单身
retryRegistry
.重试(“myRetry”)
.getEventPublisher()
.onRetry(event->LOG.info(“{}”,event));
}
@重试(name=“myRetry”)
公共无效剂量测定法(){
抛出新的RuntimeException(“它失败”);
}
}
例如


配置了
application.properties
,并使用
@Retry
注释,我成功地获得了一些输出

resilience4j.retry.instances.myRetry.maxAttempts=3
resilience4j.retry.instances.myRetry.waitDuration=1s
resilience4j.retry.instances.myRetry.enableExponentialBackoff=true
resilience4j.retry.instances.myRetry.exponentialBackoffMultiplier=2
resilience4j.retry.instances.myRetry.retryExceptions[0]=java.lang.Exception
import org.slf4j.Logger;
导入org.slf4j.LoggerFactory;
导入org.springframework.stereotype.Service;
导入io.github.resilience4j.retry.RetryRegistry;
导入io.github.resilience4j.retry.annotation.retry;
@服务
公共类MyService{
私有静态最终记录器LOG=LoggerFactory.getLogger(MyService.class);
公共MyService(RetryRegistry RetryRegistry){
//全部
retryRegistry.getAllRetries()
.forEach(重试->重试
.getEventPublisher()
.onRetry(事件->日志.info(“{}”,事件))
);
//还是单身
retryRegistry
.重试(“myRetry”)
.getEventPublisher()
.onRetry(event->LOG.info(“{}”,event));
}
@重试(name=“myRetry”)
公共无效剂量测定法(){
抛出新的RuntimeException(“它失败”);
}
}
例如


您确定客户端必须重试吗?你怎么知道?你确定客户端必须重试吗?你怎么知道的?请问基于注释的注释如何?@Retry注释本身只接受一个“name”参数。我在谷歌上搜索了更多,虽然我看到了很多关于设置重试和添加日志的信息,但我从来没有看到它们一起出现(@PatPatPat use
RetryRegistry
,请看我的答案如何基于注释?@Retry注释本身只接受一个“name”参数。我在谷歌上搜索了更多,虽然我看到了很多关于设置重试和添加日志的信息,但我从来没有看到它们在一起。:'(:')(:')(:'(@PatPatPat use
RetryRegistry
,请参阅我的答案非常感谢@Julien!非常感谢@Julien!