2017-03-15 2 views
1

Ich benutze die Hystrix-Bibliothek für das Spring Boot-Projekt (spring-cloud-starter-hystrix). Ich habe eine @Service Klasse mit @HystrixCommand kommentiert und es funktioniert wie erwartet.Hystrix und Spring @Async in Kombination

Aber wenn ich die Methode mit der Anmerkung @Async in der gleichen Serviceklasse hinzugefügt, dann funktioniert die Hystrix nicht, und Fallback-Methode wird nie aufgerufen. Was könnte dieses Problem verursachen und wie kann es behoben werden?

Dies ist die Application Klasse:

@EnableCircuitBreaker 
@EnableHystrixDashboard 
@SpringBootApplication 
public class Application { 

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

    } 
} 

Dies ist die Dienstklasse:

@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 Anmerkung in einer anderen Klasse mit @Configuration kommentierte platziert ist, wo ich einige andere Themen Executor Optionen aus der Eigenschaftendatei.

+0

zeigen Sie uns den entsprechenden Code und Konfiguration zusammen mit Fehler (* falls vorhanden *) –

+0

Ich habe die Frage aktualisiert. – dplesa

Antwort

2

den Code für TemplateService (die nicht-Schnittstelle nicht implementieren) Da und unter der Annahme, die Standardeinstellung auf @EnableAsync es sicher ist, einig, dass CGLIB Proxies durch die Feder erzeugt werden.

So ist die @HystrixCommand Anmerkung auf getGreeting()ist nicht durch die Dienst-Proxy-Klasse geerbt; Das erklärt das berichtete Verhalten.

Um diesen Fehler zu umgehen, halten Sie die @HystrixCommand und @Async Methode getrennt in verschiedenen Dienst, da die Aktivierung von JDK Proxies auch nicht helfen wird und ich bin mir nicht sicher über AspectJ Modus.

Weitere Informationen zum Spring-Proxy-Mechanismus finden Sie unter this.

+0

Vielen Dank. Also die gleiche Methode kann dann die Hystrix-Bibliothek nicht verwenden und asynchron ausführen? – dplesa

+0

Ja. Die gleiche Methode kann nicht für beide verwendet werden –

Verwandte Themen