Spring Cloud Stream Kafka暂停/恢复活页夹

时间:2018-11-26 07:23:19

标签: java apache-kafka spring-cloud-stream spring-kafka circuit-breaker

我们正在使用Spring cloude流 2.0 和Kafka作为消息代理。
我们已实现了一个断路器,用于在目标系统(数据库或第三方API)无法使用的情况下停止应用程序上下文,如此处建议的Stop Spring Cloud Stream @StreamListener from listening when target system is down

现在在Spring Cloud Stream 2.0中,有一种方法可以使用执行器Binding visualization and control

来管理活页夹的生命周期。


是否可以通过代码控制绑定程序的生命周期,这意味着如果目标服务器关闭,绑定程序将pause绑定到绑定resume,启动时绑定tidyverse

1 个答案:

答案 0 :(得分:1)

对不起,我误解了你的问题。

您可以自动连接BindingsEndpoint,但不幸的是,它的State枚举是私有的,因此您无法以编程方式调用changeState()

我有opened an issue for this

编辑

您可以通过反射来完成它,但是有点难看...

@SpringBootApplication
@EnableBinding(Sink.class)
public class So53476384Application {

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

    @Autowired
    BindingsEndpoint binding;

    @Bean
    public ApplicationRunner runner() {
        return args -> {
            Class<?> clazz = ClassUtils.forName("org.springframework.cloud.stream.endpoint.BindingsEndpoint$State",
                    So53476384Application.class.getClassLoader());
            ReflectionUtils.doWithMethods(BindingsEndpoint.class, method -> {
                try {
                    method.invoke(this.binding, "input", clazz.getEnumConstants()[2]); // PAUSE
                }
                catch (InvocationTargetException e) {
                    e.printStackTrace();
                }
            }, method -> method.getName().equals("changeState"));
        };
    }

    @StreamListener(Sink.INPUT)
    public void listen(String in) {

    }

}