我们在Spring Boot / Cloud微服务中面临Hystrix Command的问题。我们有一个Spring组件,其中包含一个用@RabbitListener
注释的方法。当新消息到达时,该方法将调用委托给NotificationService::processNotification()
。
NotificationService
是一个用@Service
注释的bean。方法processNotification()
可以请求第三方应用程序。我们希望使用@HystrixCommand
来包装第三方应用程序的调用以提供容错,但由于某些原因,Hystrix Command注释方法无法正常工作。
如果我们调用一个Controller并且Controller将调用委托给一个Service方法,而该方法又有一个Hystrix命令,那么一切都可以正常工作。当微服务消耗消息时,Hystrix命令出现的唯一问题似乎是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
并在其中实现api调用逻辑(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 + "!";
}
}