2016-12-12 7 views
1

У нас возникла проблема с командой Hystrix в микросервисе Spring Boot/Cloud. У нас есть компонент Spring, содержащий метод, аннотированный @RabbitListener. Когда приходит новое сообщение, метод делегирует вызов NotificationService::processNotification().Проблема с выпуском Spring Microservices с @HystrixCommand

NotificationService является фасоль, аннотированная @Service. Метод processNotification() может запрашивать сторонние приложения. Мы хотим обернуть вызов сторонних приложений, используя @HystrixCommand, чтобы обеспечить отказоустойчивость, но по некоторым причинам аннотированный метод Hystrix Command не работает.

Если мы вызываем контроллер, и контроллер делегирует вызов методу службы, который по очереди имеет команду Hystrix, все работает отлично. Единственная проблема с Hystrix Command возникает, когда микросервисы потребляют сообщения, и, похоже, Hystrix Command не запускает метод возврата.

Вот нерабочий код:

@Component 
public class MessageProcessor { 

    @Autowired 
    private NotificationService notificationService; 

    @RabbitListener(queues = "abc.xyz-queue") 
    public void onNewNotification(String payload) { 
     this.notificationService.processNotification(payload); 
    } 

} 

@Service 
public class NotificationService { 

    public void processNotification(String payload) { 
     ... 
     this.notifyThirdPartyApp(notificationDTO); 
     ... 
    } 

    @HystrixCommand(fallbackMethod = "notifyThirdPartyAppFallback") 
    public void notifyThirdPartyApp(NotificationDTO notificationDTO) { 
     //Do stuff here that could fail 
    } 

    public void notifyThirdPartyAppFallback(NotificationDTO notificationDTO) { 
     // Fallbacl impl goes here 
    } 

} 

@SpringBootApplication 
@EnableCaching 
@EnableCircuitBreaker 
@EnableDiscoveryClient 
@EnableRabbit 
public class NotificationApplication { 

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

сообщение некоторого кода вместо описания его. –

ответ

0

Я не уверен, что о вашей проблеме, не глядя на коде.

В качестве другого подхода, можно взять: вместо того, чтобы описывать это звонки с аннотациями в вашей службе, просто расширить HystrixCommand и реализовать апи вызова логики в нем (read more):

public class CommandHelloWorld extends HystrixCommand<String> { 

    private final String name; 

    public CommandHelloWorld(String name) { 
     super(HystrixCommandGroupKey.Factory.asKey("ExampleGroup")); 
     this.name = name; 
    } 

    @Override 
    protected String run() { 
     // a real example would do work like a network call here 
     return "Hello " + name + "!"; 
    } 
}