首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在使用弹簧启动断路器(Hystrix)时将数据从业务方法传递到回退方法?

如何在使用弹簧启动断路器(Hystrix)时将数据从业务方法传递到回退方法?
EN

Stack Overflow用户
提问于 2018-09-18 08:26:15
回答 1查看 2.1K关注 0票数 4

在官方的https://spring.io/guides/gs/circuit-breaker/手册中有

  1. 业务方法(readingList)
  2. 后备方法(可靠)

@HystrixCommand(fallbackMethod =“可靠”)公共字符串readingList() { URI uri = URI.create("http://localhost:8090/recommended");返回this.restTemplate.getForObject(uri,String.class);}公共字符串可靠(){返回"Cloud (O‘’Reilly)“};

如何将数据从业务方法传递到回退方法?使用ThreadLocal、不可变集合、并发集合、任何想法/最佳实践?

EN

回答 1

Stack Overflow用户

发布于 2019-04-25 19:24:04

用ThreadLocal?

@HystrixCommand和相应的fallbackMethod通常在一个单独的线程中执行,因为默认的execution.isolation.strategyExecutionIsolationStrategy.THREAD

这意味着,如果在执行ThreadLocal之前使用@HystrixCommand设置任何变量,则这些变量将不可用于@HystrixCommand,因为线程将是不同的。

如果有必要,您可以使用不同的隔离策略- ExecutionIsolationStrategy.SEMAPHORE

若要覆盖默认隔离策略,可以在hystrix命令定义(或在属性文件中)上这样做:

代码语言:javascript
运行
复制
@HystrixCommand(fallbackMethod = "reliable",
    commandProperties = {
        @HystrixProperty(name="execution.isolation.strategy", value="SEMAPHORE")
    }
)

传递输入参数数据

带有@HystrixCommand注解的方法和相应的fallbackMethod需要具有相同的方法签名(在抛出的异常回退中加上可选的param ),因此回退方法自然可以访问@HystrixCommand的所有输入参数。

传递异常数据

在回退方法签名中添加Throwable将包括从@HystrixCommand生成的异常

代码语言:javascript
运行
复制
   public String reliable(Throwable t) {
     return "Cloud Native Java (O'Reilly)";
   }

传递执行数据

期望从main方法传递任何执行数据到回退方法是不实际的。你不知道主方法什么时候会失败。关键是尝试定义更好的输入参数,这些参数无论如何都将与回退器共享。

例如,在您给出的代码中,URL可以成为输入参数,因此它也可以用于回退方法:

代码语言:javascript
运行
复制
@HystrixCommand(fallbackMethod = "reliable")
  public String readingList(String url) {
    URI uri = URI.create(url);

    return this.restTemplate.getForObject(uri, String.class);
  }

   public String reliable(String url, Throwable t) {
     return "Cloud Native Java (O'Reilly)";
   }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52382160

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档