Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot 如何在发生错误时停止使用来自kafka的消息,并在spring boot中一段时间后重新开始使用_Spring Boot_Apache Kafka_Spring Kafka - Fatal编程技术网

Spring boot 如何在发生错误时停止使用来自kafka的消息,并在spring boot中一段时间后重新开始使用

Spring boot 如何在发生错误时停止使用来自kafka的消息,并在spring boot中一段时间后重新开始使用,spring-boot,apache-kafka,spring-kafka,Spring Boot,Apache Kafka,Spring Kafka,这是我第一次使用卡夫卡。我有一个spring boot应用程序,我正在使用来自kafka主题的消息,并将消息存储在DB中。我有一个处理DB故障转移的要求,若DB停机,那个么消息不应该被提交,并在一段时间内暂停使用消息,一段时间后,侦听器可以再次开始使用消息。做这件事最好的方法是什么 i am using spring-kafka:2.2.8.RELEASE which is internally using kafka 2.0.1 我可以考虑采用两种方法: 第一种方法:让消费消息的自动提交选

这是我第一次使用卡夫卡。我有一个spring boot应用程序,我正在使用来自kafka主题的消息,并将消息存储在DB中。我有一个处理DB故障转移的要求,若DB停机,那个么消息不应该被提交,并在一段时间内暂停使用消息,一段时间后,侦听器可以再次开始使用消息。做这件事最好的方法是什么

 i am using spring-kafka:2.2.8.RELEASE which is internally using kafka 2.0.1

我可以考虑采用两种方法:

第一种方法:让消费消息的自动提交选项为true。此操作的配置是
enable.auto.commit
。默认情况下,这是真的,因此您不需要更改任何内容。每当DB操作失败时,您可以将消息放在不同的主题上,例如名为
failed\u events
的主题。执行此操作时,您可以让同一个应用程序(填充数据库)每天运行一次,以使用来自
failed\u events
主题的消息并再次填充数据库。通过这种方式,您可以跟踪DB写入失败的次数。需要注意的一点是,如果在此运行期间数据库也关闭了,那么您该怎么办。你可以决定在这种情况下该怎么办。如果可以,可能会丢弃消息,或者重试一定次数

第二种方法:如果非常确定DB将关闭多长时间。如果时间段很短,则最好在DB写入失败的情况下执行睡眠操作。假设应用程序在重试之前休眠10分钟。在这种情况下,您不必创建单独的主题

这种方法的优点是,您不必运行同一应用程序的单独实例来获取不同主题的内容。您可以在一个应用程序中完成所有这些操作。保持这一点变得相对容易


这种方法的缺点是,如果数据库宕机很长一段时间,比如说1天,那么您最终将丢失消息。

配置一个
ContainerStoppingErrorHandler
,并从侦听器中抛出一个异常

当检测到数据库重新联机时,可以稍后重新启动容器

编辑

@springboot应用程序
公共类SO62125817应用程序{
公共静态void main(字符串[]args){
SpringApplication.run(So62125817Application.class,args);
}
@豆子
TaskScheduler(){
返回新的ThreadPoolTaskScheduler();
}
@豆子
公共新话题(){
返回TopicBuilder.name(“so62125817”).partitions(1).replications(1.build();
}
}
@组成部分
类侦听器{
私有最终任务调度器;
私人最终卡夫卡利登记处;
公共侦听器(TaskScheduler调度器、KafkaListenerEndpointRegistry注册表、,
卡夫卡利斯特(集装箱工厂){
this.scheduler=调度程序;
this.registry=注册表;
setErrorHandler(新ContainerStoppingErrorHandler());
}
@KafkaListener(id=“so62125817.id”,topics=“so62125817”)
公共void侦听(字符串输入){
系统输出打印项次(输入);
//如果要停止容器并在60秒内重新启动它,请运行此代码
此.scheduler.schedule(()->{
this.registry.getListenerContainer(“so62125817.id”).start();
},新日期(System.currentTimeMillis()+60_000));
抛出新的运行时异常(“测试重启”);
}
}

@Gery Russell,你能帮我知道当ContainerToppingErrorHandler()的handle()方法被执行并且消费者停止时,一分钟后我可以从哪里调用Start()方法吗。你能帮我写一小段代码吗?我在Answare中添加了一个例子。