gpt4 book ai didi

spring-boot - 如何在使用 spring-boot 断路器(Hystrix)时将数据从业务方法传递到回退方法?

转载 作者:行者123 更新时间:2023-12-04 03:14:34 27 4
gpt4 key购买 nike

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

  • 业务方法(阅读列表)
  • 回退方法(可靠)

  • @HystrixCommand(fallbackMethod = "reliable")
    public String readingList() {
    URI uri = URI.create("http://localhost:8090/recommended");

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

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


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

    最佳答案

    Use ThreadLocal?


    @HystrixCommand和相应的 fallbackMethod由于默认 execution.isolation.strategy,通常在单独的线程中执行(一起)这是 ExecutionIsolationStrategy.THREAD .

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

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

    要覆盖默认隔离策略,您可以在 hystrix 命令定义(或在属性文件中)执行此操作:
    @HystrixCommand(fallbackMethod = "reliable",
    commandProperties = {
    @HystrixProperty(name="execution.isolation.strategy", value="SEMAPHORE")
    }
    )

    传递输入参数数据

    @HystrixCommand 注释的方法并且相应的 fallbackMethod 需要具有相同的方法签名(加上用于抛出异常的回退中的可选参数),因此回退方法自然可以访问 @HystrixCommand 的所有输入参数。 .

    传递异常数据

    在回退方法签名中添加 Throwable 将包括从 @HystrixCommand 产生的异常。 :
       public String reliable(Throwable t) {
    return "Cloud Native Java (O'Reilly)";
    }

    传递执行数据

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

    例如,在您提供 URL 的代码中,它可以成为输入参数,因此它也可用于回退方法:
    @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)";
    }

    关于spring-boot - 如何在使用 spring-boot 断路器(Hystrix)时将数据从业务方法传递到回退方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52382160/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com