- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我遇到了@CircuitBreaker 没有重试的问题。
我有一个服务类(例如 UserService 类和方法名称 getUser),此方法调用另一个 Spring bean(例如 AppClient 和 execute),后者又调用远程服务(REST 调用)。 execute方法使用Spring-Retry的@CircuitBreaker注解。
我已经在 rest Controller 中公开了对服务方法(类 UserService 和方法名称 getUser)的调用,并使用 Postman 对其进行了测试。这是发生了什么——如果出现超时错误,它会调用@Recover 方法。但它不会重试三次调用远程服务(默认值)。
如果我通过 Postman 手动运行它 3 次,断路器状态变为 OPEN 并将调用重定向到 @Recover 方法,并在重置超时后恢复调用远程服务。
另外,我用@Retryable 替换了@CircuitBreaker,这样调用了三次(默认值)。我正在使用 spring-retry 版本 1.2.1.RELEASE 和 aspectjtools 版本 1.6.2。
为什么不使用@CircuitBreaker 重试??我想同时拥有断路器和重试功能。根据文档,@CircuitBreaker 应该同时执行这两项操作。任何帮助将不胜感激。
@Configuration
@EnableRetry
public class cfgUserApp
{
}
@RestController
public class UserController
{
@Autowired
UserService userService;
@RequestMapping(value = "/user/{userId}", method = RequestMethod.GET, headers = "Accept=application/json")
public ResponseEntity<User> getUser(@PathVariable String userId) {
return ok(userService.getUser(userId));
}
}
/* Spring Bean -- userService */
public class UserServiceImpl
implements userService
{
@Override
public User getUser( final String userId )
{
checkArgument( User != null && !User.isEmpty(), "User Id can not be null or empty." );
try
{
final HttpGet request = buildGetUserRequest( userId );
final User userResult = appClient.execute( request,
response -> createGetReservationResult( response ) );
return userResult;
}
catch ( final IOException e )
{
LOG.error( "getUser failed.", e );
throw new AppException(e.getMessage(), e);
}
}
}
public Class Appclient {
@Recover
public <T> T recover(AppException appException, final HttpUriRequest request,
final ResponseHandler<T> responseFunction )
{
System.out.println("In Recovery");
return <T>new User();
}
@CircuitBreaker( include = AppException.class, openTimeout = 5000l, resetTimeout = 10000l )
public <T> T execute( final HttpUriRequest request,
final ResponseHandler<T> responseFunction )
{
// HTTP call
}
}
最佳答案
这可能是与this 类似的问题- 使用 JDK 代理时找不到注释,因为您有一个 interface
。
将注解移到界面上,或者使用
@EnableRetry(proxyTargetClass = true)
我向那个 PR 添加了另一个提交来解决这个问题。
编辑
你好像误解了@CircuitBreaker
;它不会在内部重试;相反,它是一个有状态的重试拦截器,在超过断路器属性后进行故障转移。
我更改了您的应用来执行此操作...
@GetMapping("/getnumber")
public int getNumber(){
return this.userService.getNumber() + this.userService.getNumber() +
this.userService.getNumber() + this.userService.getNumber();
}
然后我明白了
getNumber
fallback
getNumber
fallback
getNumber
fallback
fallback
为了实现(我认为)你想要的,你需要用重试服务包装服务,并将恢复放在那里:
@SpringBootApplication
@EnableRetry(proxyTargetClass = true)
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
@RestController
class UserRestController {
private final RetryingUserService userService;
@Autowired
public UserRestController(RetryingUserService userService) {
this.userService = userService;
}
@GetMapping("/getnumber")
public int getNumber() {
return this.userService.getNumber();
}
}
@Service
class RetryingUserService {
private final UserService userService;
public RetryingUserService(UserService userService) {
this.userService = userService;
}
@Retryable
public int getNumber() {
return this.userService.getNumber();
}
@Recover
public int fallback(RuntimeException re) {
System.out.println("fallback");
return 2;
}
}
@Service
class UserService {
@CircuitBreaker(include = RuntimeException.class)
public int getNumber() {
System.out.println("getNumber");
throw new RuntimeException();
}
}
和
getNumber
getNumber
getNumber
fallback
或者,您可能希望将重试置于断路器中,具体取决于您想要的行为。
关于Spring-retry - @Circuitbreaker 没有重试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52951979/
我使用此代码调用azure api: http://pythonfiddle.com/sjj/ 但是错误消息是: Client-Request-ID=b68d2b74-5e54-11e8-9b
我是 Angular 4.3 的新手。我有一个 map 应用程序,它通过下载一系列小图像(“图 block ”)来呈现“ map 层”。在启动时, map 层可能需要 0.1 - 5.0 秒的时间来下
我正在尝试测试使用自定义重试策略的重试模板。为此,我使用以下示例: https://github.com/spring-projects/spring-retry/blob/master/src/te
我正在尝试做 pip install --upgrade pip并保持 收到此错误: WARNING: Retrying (Retry(total=4, connect=None, read=None
我正在使用微软的标准示例将新实体插入到表中。有没有办法跟踪是否执行了重试? 代码: CloudTableClient tableClient = storageAccount.CreateCloudT
我正在使用 Spring-retry-1.2.0 ,重试工作正常,但在我的方法中,我想知道重试是否是最后一次重试,是否有任何方法可以在 spring-retry 中获取 retrialCount 或最
我正在尝试全新安装 virtualbox、vagrant、homestead 和最终的 laravel。刚开始使用新笔记本电脑。我之前已经用 homestead 设置了 vagrant 并且没有问题。
目录 循环加判断 retrying 总结 我们在程序开发中,经常会需要请求一些外部的接口资源,而且我们不能保证每次请求一定会成功,所以这些涉及到网络请
我们在程序开发中,经常会需要请求一些外部的接口资源,而且我们不能保证每次请求一定会成功,所以这些涉及到网络请求的代码片段就需要加上重试机制。下面来说一下Python中的重试方法。
spring-retry 的@CircuitBreaker 和spring-cloud-starter-netflix-hystrix 的@HystrixCommand 有什么区别? 它们似乎都实现了
我在 Spring Boot 项目中使用 Resilience4J 来调用 REST 客户端,如下所示: @Retry(name = "customerService") public Custome
我有一个有两台服务器的网站——一台专门用于面向客户端的 Web 服务,另一台是更强大的数据处理服务器。 我目前有一个过程,其中 Web 服务器与数据服务器联系以获取通常如下所示的多个请求: paylo
我遇到了@CircuitBreaker 没有重试的问题。 我有一个服务类(例如 UserService 类和方法名称 getUser),此方法调用另一个 Spring bean(例如 AppClien
请问是否可以使用弹性 4j 在客户端记录重试尝试? 也许通过某种配置或设置。 目前,我正在使用带有 Spring boot Webflux 基于注释的resilience4j。 效果很好,这个项目很棒
我在使用 python3 中 tenacity 库中的“重试”工具时遇到问题。当我使用生成器时,“重试”装饰器似乎不起作用。 我有一个代码示例来说明我的情况: from tenacity import
所以我这里有一个 Azure 机器学习管道,它由许多 PythonScriptStep 任务组成 - 确实非常基本。 由于网络问题或其他问题,其中一些脚本步骤会间歇性失败 - 确实没有什么意外。这里的
如果我为多个上游反向代理设置了 nginx 负载平衡,其中一个出现故障,我的用户会收到 502 错误消息,还是 nginx 会负责重新路由到已启动的上游? 最佳答案 来自 documentation
我正在创建一个应用程序,它可以恢复并显示在线存储在 mysql 主机上的 html 文本。如果快照没有任何数据,它应该重试查询并重建 View ,直到它获得数据。 这就是我使用数据库中的数据创建小部件
我想在 Spring Boot 2.2.1.RELEASE 项目中使用 resilience4j-spring-boot2 来重试针对第三方服务的失败请求。但是,由于某种原因,我无法注册fallbac
我正在使用resilience4j.retry与 resilience4j.circuitbreaker 。 Service1 正在调用另一个服务 Service2,该服务可能会引发异常。即使出现异常
我是一名优秀的程序员,十分优秀!