如何优雅地关闭 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

All Actuator's commands