Spring boot 春天的云流卡夫卡-如何阻止消费者

Spring boot 春天的云流卡夫卡-如何阻止消费者,spring-boot,apache-kafka,spring-cloud-stream,Spring Boot,Apache Kafka,Spring Cloud Stream,我有一个SpringCloudStreams客户端,它读取由几个分区组成的Kakfa主题。客户端为它读取的每一条卡夫卡消息调用一个Web服务。如果重试几次后Web服务不可用,我想阻止消费者阅读Kafka。参考前面的Stackoverflow问题(),我自动连线了BindingsEndpoint,并调用changeState()方法试图停止使用者,但日志显示,在调用changeState()后,使用者继续读取来自Kafka的消息 我正在使用SpringBootVersion2.1.2.RELEAS

我有一个SpringCloudStreams客户端,它读取由几个分区组成的Kakfa主题。客户端为它读取的每一条卡夫卡消息调用一个Web服务。如果重试几次后Web服务不可用,我想阻止消费者阅读Kafka。参考前面的Stackoverflow问题(),我自动连线了BindingsEndpoint,并调用changeState()方法试图停止使用者,但日志显示,在调用changeState()后,使用者继续读取来自Kafka的消息

我正在使用SpringBootVersion2.1.2.RELEASE和SpringCloudVersionGreenwich.RELEASE。SpringCloudStreamBinder kafka的托管版本为2.1.0.0版本。我已经设置了属性autocommitofset=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);
  }
}
@Autowired
私有BindingsEndpoint BindingsEndpoint;
...
...
@StreamListener(MyInterface.INPUT)
公共无效读取(@Payload MyDTO dto,
@标题(KafkaHeaders.RECEIVED_主题)字符串主题,
@标题(KafkaHeaders.RECEIVED_PARTITION_ID)int PARTITION,
@标题(KafkaHeaders.CONSUMER)消费者(CONSUMER){
试一试{
logger.info(“处理消息”+dto);
process(dto);//这是调用Web服务的方法
}捕获(例外e){
if(IllegalStateException的e实例| | ConnectException的e实例){
bindingsEndpoint.changeState(“my.topic.name”,
BindingsEndpoint.State.STOPPED);
//Binding b=bindingsEndpoint.queryState(“my.topic.name”);==>使用主题名返回有效的绑定对象
}
e、 printStackTrace();
投掷(e);
}
}

您可以通过使用该功能来实现,在该功能中,您可以可视化和停止/启动/暂停/恢复绑定


另外,您还知道
System.exit()
将关闭整个JVM?

您可以通过使用该功能来实现此目的,该功能可以可视化以及停止/启动/暂停/恢复绑定


另外,您知道
System.exit()
将关闭整个JVM?

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

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

只有在处理完从上一次
poll()
收到的所有消息后,停止消费者才会生效。如果要立即停止,需要将kafka consumer属性
max.poll.records
设置为
1
。只有在处理完从上一次
poll()
接收的所有消息后,停止消费者才会生效。如果要立即停止,需要将kafka消费者属性
max.poll.records
设置为
1