@HystrixCommand

时间:2016-12-12 23:24:59

标签: spring spring-boot spring-amqp hystrix

我们在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);
    }
}

1 个答案:

答案 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 + "!";
    }
}