【问题标题】:spring-kafka listener shutdownspring-kafka 监听器关闭
【发布时间】:2018-12-20 14:43:37
【问题描述】:

我正在尝试验证当我关闭我的应用程序时(优雅地或以某种激进的方式),kafka-listeners 是否已正常关闭。有人可以指出我处理它的地方吗?我正在查看 destroyclose 方法,但我找不到 kafka 客户端注销实际发生的位置。

如果注销时间过长会怎样?或者如果其他一些spring bean关闭钩子需要太多时间?

对于当前处理事件的实际意义是什么?如果他们碰巧完成了他们的工作,他们可以在关闭期间提交补偿吗?

我正在使用 spring-kafka 1.3.5 版本。

【问题讨论】:

    标签: spring-kafka


    【解决方案1】:

    当前 1.3.x 版本为 1.3.8;你应该升级。 1.3.9 将于 1 月初发布。

    当您stop() 侦听器容器时,该容器将以有序的方式停止并处理先前由pol() 返回的所有记录(但不会进行进一步的轮询)。但是,您应该确保您的侦听器将在 shutdownTimeout(默认 10 秒,但可配置)内处理任何剩余的记录。 stop() 操作将在这段时间内阻塞,等待容器停止。

    对于更现代的版本(2.2.x,当前为 2.2.2),您可以使用 ApplicationListener@EventListener 来使用 ContainerStoppedEvent

    【讨论】:

    • 所以,当我杀死 spring 应用程序时,然后 - 在销毁 spring 应用程序上下文期间 - 在所有 kafka 容器上调用 stop() 方法,并且 spring 也等待容器完成停止?我知道这可能与弹簧有关 - 我想弹簧也有一些限制 - 你知道弹簧本身等待多长时间?
    • 用什么方式杀? JVM 立即被kill -9 杀死,因此没有有序的关闭。使用 sigterm kill,应用程序上下文将正常关闭; Spring 在放弃之前最多等待 30 秒。如果你使用 ackmode 记录,这不是世界末日,因为任何未提交的记录偏移量将在你下次启动应用程序时重新发送。
    • @GaryRussell 使用 spring-cloud-stream (1.2.X) @StreamListener987654329@
    猜你喜欢
    • 2022-01-03
    • 1970-01-01
    • 2020-10-03
    • 2021-03-11
    • 1970-01-01
    • 2018-11-08
    • 1970-01-01
    • 2017-12-01
    • 2022-01-12
    相关资源
    最近更新 更多