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

时间:2018-09-18 08:26:16

标签: spring-boot hystrix circuit-breaker

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

  1. 业务方法(readingList)
  2. 后备方法(可靠)
org.springframework.boot.web.embedded.jetty.JettyServletWebServerFactory

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

1 个答案:

答案 0 :(得分:0)

  

使用ThreadLocal吗?

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

因此,这意味着如果在执行@HystrixCommand之前使用ThreadLocal设置任何变量,@HystrixCommand将无法使用它们,因为线程会有所不同。

如果需要执行上述操作,则可以使用其他隔离策略-ExecutionIsolationStrategy.SEMAPHORE

要覆盖默认的隔离策略,可以在hystrix命令定义上(或在属性文件中)执行此操作:

@HystrixCommand(fallbackMethod = "reliable",
    commandProperties = {
        @HystrixProperty(name="execution.isolation.strategy", value="SEMAPHORE")
    }
)

传递输入参数数据

@HystrixCommand注释的方法和相应的fallbackMethod需要具有相同的方法签名(在fallback中加上抛出抛出异常的可选参数),因此,fallback方法自然可以访问{{ 1}}。

传递异常数据

在后备方法签名中添加Throwable将包括@HystrixCommand产生的异常:

@HystrixCommand

传递执行数据

期望将任何执行数据从main方法传递到fallback方法是不切实际的。您不知道main方法何时会失败。 关键是尝试定义更好的输入参数,无论如何这些参数都将与后备共享。

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

   public String reliable(Throwable t) {
     return "Cloud Native Java (O'Reilly)";
   }