当前位置: 首页 > 知识库问答 >
问题:

Hystrix Javanica回退在Spring Cloud 1.0中不起作用

双弘益
2023-03-14

我基于@SpencerGibb feign-eureka spring cloud starter示例构建了一个超级简单的Hystrix短路示例。一开始,我以为我不能让hystrix javanica默认的fallbackMethod触发由于虚假…现在,除去feign,hystrix默认的fallbackMethod仍然不能捕获异常。

pom.xml

<parent>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-parent</artifactId>
    <version>1.0.0.RELEASE</version>
    <relativePath /> <!-- lookup parent from repository -->
</parent>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <java.version>1.8</java.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</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>
    :
</dependencies>

主文件:

@SpringBootApplication
@EnableDiscoveryClient
@EnableHystrix
@RestController
public class HelloClientApplication {

  @Autowired
  HelloClientComponent helloClientComponent;

  @RequestMapping("/")
  public String hello() {
    return helloClientComponent.makeMultipleCalls();
  }

  public static void main(String[] args) {
    SpringApplication.run(HelloClientApplication.class, args);
  }

java(创建HelloClientComponent.java是因为我知道javanica希望位于spring托管组件或服务中):

@Component
public class HelloClientComponent {

@Autowired
RestTemplate restTemplate;

public String makeMultipleCalls() {
    int cnt=20;
    StringBuilder sb = new StringBuilder();
    while (cnt-- > 0) {
        String response = theServerRequestRoot();
        sb.append(response).append("  ");
    }
    return sb.toString();
}

public String theServersRequestRootFallback() {
    System.out.println("BOMB!!!!!!");
    return "BOMB!!!!!!";
}

@HystrixCommand(fallbackMethod = "theServersRequestRootFallback", commandKey = "callToServers")
public String theServerRequestRoot() {
        ResponseEntity<String> result = restTemplate.getForEntity("http://HelloServer", String.class);
        System.out.println(result.getBody());
        return result.getBody();
}
}

根据Spencer和Dave的建议更新解决方案。更改为以下内容:

主应用程序文件:

@SpringBootApplication
@EnableDiscoveryClient
@EnableHystrix
@RestController
public class HelloClientApplication {

  @Autowired
  HelloClientComponent helloClientComponent;

@RequestMapping("/")
public String hello() {
    int cnt=20;
    StringBuilder sb = new StringBuilder();
    while (cnt-- > 0) {
        String response = helloClientComponent.theServerRequestRoot();     // call directly to @Component in order for @HystrixCommand to intercept via AOP
        sb.append(response).append("  ");
    }
    return sb.toString();
}

  public static void main(String[] args) {
    SpringApplication.run(HelloClientApplication.class, args);
  }
  }
@Component
public class HelloClientComponent {

@Autowired
RestTemplate restTemplate;

public String theServersRequestRootFallback() {
    System.out.println("BOMB!!!!!!");
    return "BOMB!!!!!!";
}

@HystrixCommand(fallbackMethod = "theServersRequestRootFallback", commandKey = "callToServers")
public String theServerRequestRoot() {
        ResponseEntity<String> result = restTemplate.getForEntity("http://HelloServer", String.class);
        System.out.println(result.getBody());
        return result.getBody();
}
}

暂时还没有答案

 类似资料:
  • 我试图让Camel使用退避重发策略重试一个msg到JMS(实际上是MQ over JMS)。以下是我得到的: 我对这里应该发生的事情的理解是,初始超时将是1000ms。之后,骆驼将等待2000ms,然后4000ms,等等,直到我们到达30000ms。 正在发生的是,消息被重试,但每次重试1000ms。 我可能需要在上面的代码中更改什么才能得到我要寻找的结果? TIA

  • 问题内容: (使用Chrome 44测试) 所需行为 :发出XHR请求,将结果放入文本区域,选择文本,然后复制到剪贴板。 实际行为 :成功执行XHR请求后,将结果放在文本区域中并选择它,但是无法将结果复制到剪贴板。但是,如果我在XHR回调之外启动副本,则可以正常工作。 示例html页面: 如果按“获取数据并复制文本区域”按钮,则数据已成功获取但未复制。如果按“复制文本区域”按钮,则文本将按预期复制

  • 问题内容: 我有一个MySQL数据库,正在使用。 由于某些原因,我无法使事务正常运行。如果我打电话,它不会回滚。 示例代码: 结果是将另一行添加到myTable。谁能想到一个原因? 问题答案: 您使用的是myIsam还是innodb?据我所知,它仅适用于innodb

  • 我是LiquiBase的新手。我可以使用LiquiBase更新(具有创建表的变更集)到Oracle数据库。在进行更新时,我还创建了标记。但是当我尝试回滚更新的更改(即删除创建的表)时,使用该标记。桌子没有掉下来。 我使用的是liquibase-maven插件3.4.2。下面是Maven中的代码。 请帮我解决这些问题。

  • 我用的是Spring MVC(4.2.2.RELEASE)和Tomcat 8。我的要求是向浏览器发送一个通知。请找到下面的代码。 控制器-------------------@Controller公共类MessageController{/@Autowired private SimpMessageTemplate模板;@Autowire private SimpMessageSendingOpe