Spring-Cloud-Streams Kafka-如何阻止消费者

时间:2019-04-05 09:07:39

标签: spring-boot apache-kafka spring-cloud-stream

我有一个Spring-Cloud-Streams客户端,它从一个由多个分区组成的Kakfa主题中读取。客户端为读取的每个Kafka消息调用一个Web服务。如果几次重试后Web服务不可用,我想阻止用户从Kafka读取。参考上一个Stackoverflow问题(Spring cloud stream kafka pause/resume binders),我自动连接了 BindingsEndpoint ,并调用 changeState()方法以尝试停止使用方,但日志显示该使用方正在继续在调用 changeState()后从Kafka中读取消息。

我正在使用Spring Boot版本2.1.2.RELEASE和Spring Cloud版本Greenwich.RELEASE。 spring-cloud-stream-binder-kafka的托管版本是2.1.0.RELEASE。我已经设置了属性autoCommitOffset = true和autoCommitOnError = false。

下面是我的代码段。有什么我想念的吗? changeState()的第一个输入参数应该是主题名称吗?

如果我希望使用者应用程序在Web服务不可用时退出,是否可以简单地执行System.exit()而不需要先停止使用者?

@Autowired
private BindingsEndpoint bindingsEndpoint;

...
...
@StreamListener(MyInterface.INPUT)  
    public void read(@Payload MyDTO dto,
            @Header(KafkaHeaders.RECEIVED_TOPIC) String topic,
            @Header(KafkaHeaders.RECEIVED_PARTITION_ID) int partition,
            @Header(KafkaHeaders.CONSUMER) Consumer<?, ?> consumer) {
        try {

            logger.info("Processing message "+dto);
            process(dto); // this is the method that calls the webservice


        } catch (Exception e) {

            if (e instanceof IllegalStateException || e instanceof ConnectException) {

                bindingsEndpoint.changeState("my.topic.name", 
                    BindingsEndpoint.State.STOPPED);    
                // Binding<?> b = bindingsEndpoint.queryState("my.topic.name"); ==> Using topic name returns a valid Binding object                     
            }

                e.printStackTrace();
                throw (e);
  }
}

2 个答案:

答案 0 :(得分:1)

您可以利用Binding visualization and control功能来实现此目的,在该功能中,您可以可视化以及停止/开始/暂停/恢复绑定。

还知道using System; using Prism.Commands; namespace TestWpfApplication { internal class Student { DelegateCommand selectCommand; public string Type => "Student"; public string FullName => "My name is student"; public DelegateCommand SelectCommand { get => selectCommand ?? (selectCommand = new DelegateCommand(Select, CanSelect)); } public bool CanSelect() { return false; } public void Select() { Console.WriteLine("Student Clicked"); } } } 将关闭整个JVM吗?

答案 1 :(得分:-1)

有同样的问题,changeState()的第一个输入参数应该是绑定名称。对我有用