2017-03-15 56 views
1

我使用Hystrix庫進行Spring Boot項目(spring-cloud-starter-hystrix)。我有一個@Service班註釋@HystrixCommand,它按預期工作。Hystrix和Spring @Async組合

但是,當我在相同的服務類中添加註釋爲@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,我在那裏設置一些其他線程執行器選項註釋不同的類從屬性文件。

+0

告訴我們相關的代碼和配置以及錯誤(*如果有的話) –

+0

我已經更新了這個問題。 – dplesa

回答

2

鑑於TemplateService代碼(不實現接口)並假定在@EnableAsync它是安全的同意,CGLIB代理被彈簧創建的缺省值。

因此getGreeting()上的@HystrixCommand註釋並不是由服務代理類繼承的;這解釋了報道的行爲。

爲了避免這個錯誤,請保持@HystrixCommand@Async方法在不同的服務中分開,因爲啓用JDK代理服務器也無濟於事,我不確定有關AspectJ模式。

有關Spring代理機制的更多信息,請參閱this

+0

謝謝。那麼同樣的方法不能使用Hystrix庫並異步執行? – dplesa

+0

是的..同樣的方法不能用於兩者 –