Java Resilience4j重试-记录来自客户端的重试尝试?
是否可以使用resilience4j在客户端记录重试尝试 可能通过某种配置或设置 目前,我正在使用resilience4j和Spring boot Webflux基于注释的 这是伟大的工作,该项目是惊人的 当我们将服务器日志放在服务器端时,为了查看由于重试(我们记录时间、客户端IP、请求ID等)而进行了相同的http调用,我可以拥有客户端日志吗 我希望看到类似“Resilience4j-客户端:第一次尝试因某些异常而失败,第二次尝试因某些异常而失败,第三次尝试成功!” 差不多吧。是否有一个属性,一些配置,一些设置,可以帮助轻松地做到这一点,请?没有添加太多的锅炉代码Java Resilience4j重试-记录来自客户端的重试尝试?,java,spring-webflux,resilience4j,Java,Spring Webflux,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 useRetryRegistry
,请参阅我的答案非常感谢@Julien!非常感谢@Julien!