如何优雅地关闭 spring-kafka 消费者应用程序
How to gracefully shutdown spring-kafka consumer application
我已经实现了 spring-kafka
消费者应用程序。
我希望消费者应用程序正常关闭。
当前消费者应用程序被 Linux 命令终止 kill -9 pid
我现在正在使用 @KafkaListener
注释。
如果我退出 Spring 启动应用程序,我想可靠地关闭消费者,我应该怎么做?
我一直在使用 @Predestory
可靠地退出 spring 启动应用程序,但我不太确定这是否与它有任何关系。
如果要停止单个消费者,只需在侦听器容器上调用 stop()
。
请注意,当您调用 stop()
时,容器将处理从 poll()
获取的所有记录,直到容器关闭之前。
kill -9
就像死星
Some of the more commonly used signals:
1 HUP (hang up)
2 INT (interrupt)
3 QUIT (quit)
6 ABRT (abort)
9 KILL (non-catchable, non-ignorable kill)
14 ALRM (alarm clock)
15 TERM (software termination signal)
默认kill信号SIGTERM(15)
kill <pid>
Boot 将优雅地关闭一切;它注册了一个关闭钩子,它不能拦截 kill -9
.
好的,我会把我的想法写在这里。
kill
都会导致线程中断。没关系,当消息消费者是单线程的。
但是如果消息处理使用内部线程(或执行器,任何在不同线程中工作的东西),它们也会捕获中断。没有办法阻止它。
在批处理模式的情况下,甚至很难跟踪正确的偏移量,因为一些消息已经被处理,而一些 - 没有。所以还有另一种方法 - 告诉消费者停止收听但完成处理或在这一步轮询的那些项目。
所以我们不应该使用任何中断,但停止应该是对应用程序的编程命令。
Spring 提供了一个 sub-project 执行器,它允许您接收有关组件状态的信息并对其进行控制。
为了安装它,只需添加两个依赖项到 pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
您还必须在属性文件中分配端口号:
server.port= your free port like 8081
此外,为了使执行器正确关闭组件,必须在属性文件中设置另一个参数:
server.shutdown=graceful
要使用执行器关闭组件,请使用命令:
curl 'http://localhost:8080/actuator/shutdown' -i -X POST
我已经实现了 spring-kafka
消费者应用程序。
我希望消费者应用程序正常关闭。
当前消费者应用程序被 Linux 命令终止 kill -9 pid
我现在正在使用 @KafkaListener
注释。
如果我退出 Spring 启动应用程序,我想可靠地关闭消费者,我应该怎么做?
我一直在使用 @Predestory
可靠地退出 spring 启动应用程序,但我不太确定这是否与它有任何关系。
如果要停止单个消费者,只需在侦听器容器上调用 stop()
。
请注意,当您调用 stop()
时,容器将处理从 poll()
获取的所有记录,直到容器关闭之前。
kill -9
就像死星
Some of the more commonly used signals:
1 HUP (hang up)
2 INT (interrupt)
3 QUIT (quit)
6 ABRT (abort)
9 KILL (non-catchable, non-ignorable kill)
14 ALRM (alarm clock)
15 TERM (software termination signal)
默认kill信号SIGTERM(15)
kill <pid>
Boot 将优雅地关闭一切;它注册了一个关闭钩子,它不能拦截 kill -9
.
好的,我会把我的想法写在这里。
kill
都会导致线程中断。没关系,当消息消费者是单线程的。
但是如果消息处理使用内部线程(或执行器,任何在不同线程中工作的东西),它们也会捕获中断。没有办法阻止它。
在批处理模式的情况下,甚至很难跟踪正确的偏移量,因为一些消息已经被处理,而一些 - 没有。所以还有另一种方法 - 告诉消费者停止收听但完成处理或在这一步轮询的那些项目。 所以我们不应该使用任何中断,但停止应该是对应用程序的编程命令。
Spring 提供了一个 sub-project 执行器,它允许您接收有关组件状态的信息并对其进行控制。
为了安装它,只需添加两个依赖项到 pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
您还必须在属性文件中分配端口号:
server.port= your free port like 8081
此外,为了使执行器正确关闭组件,必须在属性文件中设置另一个参数:
server.shutdown=graceful
要使用执行器关闭组件,请使用命令:
curl 'http://localhost:8080/actuator/shutdown' -i -X POST