【问题标题】:SpringBoot: @HystrixCommand not workingSpringBoot:@HystrixCommand 不起作用
【发布时间】:2017-08-03 16:40:59
【问题描述】:

使用 Eureka/Ribbon 感知的 RestTemplate 配置时,不会调用使用 @HystrixCommand 指定的后备方法。

pom.xml

....
<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-hystrix</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-ribbon</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bus-amqp</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-feign</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>
....

@SpringBootApplication配置

@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker
@EnableHystrix
public class FileUploadServiceApplication {
   ...
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
  ...
}

@Component
@RefreshScope
public class FileUploadServiceImpl implements FileUploadService {
 ....
@HystrixCommand(fallbackMethod = "fallbackToMessageQ")
    private void notifyComplete(String fileName) {
     this.restTemplate.exchange(
                    "http://DISCOVERY-CLIENT/api/file/process?filename="+fileName, ....)
      ....
    }
    private void fallbackToMessageQ(String fileName, Throwable t) {
        System.out.println("notify threw exception, "+t.getMessage());
        rabbitTemplate.convertAndSend(uploadCompleteExchangeName, "", fileName.getBytes());
    }
}

当执行时它在抛出 IllegalStateException 后结束,因为无法访问 DISCOVERY-CLIENT 并且永远不会访问回退方法,如果我需要配置其他任何东西,请告诉我。

java.lang.IllegalStateException: No instances available for DISCOVERY-CLIENT
        at org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient.execute(RibbonLoadBalancerClient.java:90)
        at org.springframework.cloud.client.loadbalancer.RetryLoadBalancerInterceptor$1.doWithRetry(RetryLoadBalancerInterceptor.java:88)
        at org.springframework.cloud.client.loadbalancer.RetryLoadBalancerInterceptor$1.doWithRetry(RetryLoadBalancerInterceptor.java:76)
        at org.springframework.retry.support.RetryTemplate.doExecute(RetryTemplate.java:286)
        at org.springframework.retry.support.RetryTemplate.execute(RetryTemplate.java:163)

【问题讨论】:

    标签: java spring-boot spring-cloud hystrix spring-cloud-netflix


    【解决方案1】:

    @HystrixCommand 与 AOP 切入点一起使用,您的方法是 private。将其可见性更改为公开。

    【讨论】:

    • 公开了,没用,把它移到另一个@component 让它工作。
    • @SomasundaramSekar 谢谢,您的评论解决了我的问题!
    • 这太奇怪了,我不得不做同样的事情,将它移动到 @Service 使其工作。它在声明为@RestController 的同一类中不起作用...
    猜你喜欢
    • 2018-12-08
    • 2016-07-04
    • 2018-10-02
    • 2019-04-28
    • 2021-12-10
    • 2021-01-19
    • 1970-01-01
    • 1970-01-01
    • 2017-08-10
    相关资源
    最近更新 更多