Hystrix和Spring @Async组合在一起

时间:2017-03-15 12:55:12

标签: spring spring-boot spring-cloud hystrix

我,正在使用Hystrix库进行Spring Boot项目(spring-cloud-starter-hystrix)。我有一个用@Service注释的@HystrixCommand类,它按预期工作。

但是,当我在同一个服务类中添加用@Async注释的方法时,Hystrix不起作用,并且永远不会调用回退方法。什么可能导致这个问题,以及如何解决它?

这是Application类:

@EnableCircuitBreaker
@EnableHystrixDashboard
@SpringBootApplication
public class Application {

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

    }
}

这是服务类:

@Service
public class TemplateService {
@HystrixCommand(fallbackMethod = "getGreetingFallback", commandProperties = { @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "1500") })
    public String getGreeting() {
        URI uri = URI.create("http://localhost:8090/greeting");

        ResponseEntity<String> response = restTemplate.exchange(uri, HttpMethod.GET, null, String.class);
        if (response.getStatusCode().equals(HttpStatus.OK)) {
            return response.getBody();
        } else {
            return null;
        }
    }

    public String getGreetingFallback(Throwable e) {
        return null;
    }
}

@Async
public void async(String message) {
    try {
        Thread.sleep(5000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    logger.info(MessageFormat.format("Received async message {0}", message));
}

@EnableAsync注释放在一个用@Configuration注释的不同类中,我从属性文件中设置了一些其他的Thread Executor选项。

1 个答案:

答案 0 :(得分:2)

鉴于TemplateService未实现接口)的代码并假设@EnableAsync上的默认值,可以安全地同意由spring创建CGLIB代理。

因此@HystrixCommand 上的getGreeting()注释不是由服务代理类继承的;这解释了报告的行为。

要克服此错误,请将@HystrixCommand@Async方法分隔在不同的服务中,因为启用JDK代理也无济于事,我不确定AspectJ模式。

有关Spring代理机制的更多信息,请参阅this