利用钩子优雅关停kafka

背景

利用kafka进行消息生产和消费,生产线程或消费线程在tomcat关闭的时候无法优雅的停止,一定要强制退出才行。很不体面。

Runtime.addShutdownHook解释

如果你想在jvm关闭的时候进行内存清理、对象销毁等操作,或者仅仅想起个线程然后这个线程不会退出,你可以使用Runtime.addShutdownHook。

这个方法的作用就是在JVM中增加一个关闭的钩子。当程序正常退出、系统调用 System.exit方法或者虚拟机被关闭时才会执行系统中已经设置的所有钩子,当系统执行完这些钩子后,JVM才会关闭。所谓钩子,就是一个已初始化但并不启动的线程。JVM退出通常通过两种事件。

  • 程序正常退出,例如最后一个非守护进程退出、使用System.exit()退出等
  • 程序异常退出,例如使用Ctrl+C触发的中断、用户退出或系统关闭等系统事件等 该方法的说明如下,详细说明参见官方文档
void java.lang.Runtime.addShutdownHook(Thread hook)
Parameters:
hook - An initialized but unstarted Thread object
Throws:
IllegalArgumentException - If the specified hook has already been registered, or if it can be determined that the hook is already running or has already been run
IllegalStateException - If the virtual machine is already in the process of shutting down
SecurityException - If a security manager is present and it denies RuntimePermission("shutdownHooks")

kafka代码示例

在start的时候加个钩子即可

Runtime.getRuntime().addShutdownHook(new Thread() {

                @Override
                public void run() {
                    KafkaConsumer.this.close();
                }
            });
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,027评论 19 139
  • 一.线程安全性 线程安全是建立在对于对象状态访问操作进行管理,特别是对共享的与可变的状态的访问 解释下上面的话: ...
    黄大大吃不胖阅读 878评论 0 3
  • 目标:种出理想的伴侣。 感恩冥想: 1、感恩今天与同事一起协同工作。 2、感恩今天又得到了客户满意度评价。 3、感...
    小兔兔姐姐爱吃胡萝卜阅读 192评论 0 0
  • 2018年1月10日上午由 组织部长、区关工委主任徐文凯, 区关工委执行主任王玉建, 区关工委常...
    聚集一线阅读 753评论 0 0
  • 偶然间,又见她,一个三十出头风韵迷人,风姿绰约的少妇。她骑着摩托车,背上背着小孩,脸上洋溢着自信和幸福。 认识她有...
    显山露水阅读 865评论 13 10