ActiveMQ消费者平滑关闭

平滑关闭的思路就是让正在执行的任务线程正常执行完毕,然后再关闭JVM。在JVM关闭之前触发一个shutdown hook,jvm自带这个hook,在java启动时候就可以注册这样的hook。

##1、简述JVM关闭钩子(shutdown hook) 首先JVM的关闭方式可以分为三种:

  • 正常关闭:当最后一个非守护线程结束或者调用了System.exit或者通过其他特定平台的方法关闭(发送SIGINT,SIGTERM信号等)

  • 强制关闭:通过调用Runtime.halt方法或者是在操作系统中直接kill(发送SIGKILL信号)掉JVM进程

  • 异常关闭:运行中遇到RuntimeException异常等。

在某些情况下,我们需要在JVM关闭时做些扫尾的工作,比如删除临时文件、停止日志服务以及内存数据写到磁盘等,为此JVM提供了关闭钩子(shutdown hooks)来做这些事情。另外特别注意的是:如果JVM因异常关闭,那么子线程(Hook本质上也是子线程)将不会停止。但在JVM被强行关闭时,这些线程都会被强行结束。

另外在使用关闭钩子还要注意以下几点:

  1. 不能在钩子调用System.exit(),否则卡住JVM的关闭过程,但是可以调用Runtime.halt()。
  2. 不能再钩子中再进行钩子的添加和删掉操作,否则将会抛出IllegalStateException。
  3. 在System.exit()之后添加的钩子无效。
  4. 当JVM收到SIGTERM命令(比如操作系统在关闭时)后,如果钩子线程在一定时间没有完成,那么Hook线程可能在执行过程中被终止。
  5. Hook线程中同样会抛出异常,如果抛出异常又不处理,那么钩子的执行序列就会被停止。

##2、 ActiveMQ消费者的钩子

先讲一下我的消费者整体情况:

1、使用Spring集成ActiveMQ,用Spring容器进行bean的管理

2、用DefaultMessageListenerContainer来监听处理队列里的消息

直接贴代码:

//消费者是普通的java工程,通过这个类的main方法启动,这里只贴出main函数里的代码
public static void main( String[] args ) {log.info("start APP......");ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring/applicationContext.xml");//testContainer是在配置文件中配置的监听器final DefaultMessageListenerContainer container = (DefaultMessageListenerContainer)context.getBean("testContainer");Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {public void run() {System.out.println("-------------------- 消费者JVM即将关闭,执行清场操作 --------------------");//关闭线程池,等待线程池积压消息处理container.shutdown();System.out.println("-------------------- 消费者关闭,线程池处理完毕 --------------------");//不要在钩子里面执行System.exit,调用halt()是可以正常关闭系统的,但是貌似没这个必要//Runtime.getRuntime().halt(0);}}));
}

为了可以更直观的看到这个等待任务线程处理完的一个过程,在任务线程里添加sleep代码。

public class TestMessageListener   implements  SessionAwareMessageListener {public void onMessage(Message message, Session session) {if (message instanceof TextMessage) {TextMessage textMsg = (TextMessage) message;try {Thread.sleep(1000L);System.out.println(Thread.currentThread().getName() + ",接收到一个纯文本消息,消息内容是:" + textMsg.getText());} catch (JMSException e) {e.printStackTrace();}catch (InterruptedException e) {e.printStackTrace();}}}
}

运行结果如下:

输入图片说明

##3、 关闭消费者

关闭消费者的时候也很重要,不要使用kill -9的方式来杀进程,这是无脑杀。

ref:

  • 深入JVM关闭与关闭钩子
  • JAVA虚拟机关闭钩子(Shutdown Hook)
  • Java消息队列任务的平滑关闭
  • 使用后台进程和 Shutdown Hook 友好地关闭 Tomcat

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/497502.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二叉堆时间复杂度 php,二叉堆(Binary Heap)

二叉堆这个数据结构有点意思,自己做了个总结,内容结构如下:二叉堆性质二叉堆操作应用二叉堆性质:堆(Heap)是一个可以被看成近似完全二叉树的结构,具有完全二叉树的特性:缺少的叶子节点总是位于右子节点n个节…

产业丨一文读懂人工智能产业链,未来10年2000亿美元市场

来源:国防科技信息网概要:针对人工智能产业链,主要有三个核心:基础技术、人工智能技术及人工智能应用,本文将从主要从这三个方面进行梳理。人工智能(Artificial Intelligence),英文缩…

2017年高性能计算领域的成功与失败

来源:中科院信息科技战略情报概要:2017年,机器学习和各种人工智能应用在高性能计算领域持续发挥着重要影响力。2017年12月9日,TOP500官网刊文总结了高性能计算在2017年取得的新进展,以及未来发展趋势,主要内…

Science封面:谁动了我的DNA?原来是你拿去做机器人了

来源:机器人大讲堂概要:慕尼黑工业大学的Friedrich C. Simmel团队使用DNA分子,组装出了一个可以远程控制的纳米机械臂,并用它成功推动了一个纳米金颗粒。本周《Science》期刊的封面故事,介绍了一款德国制造的灵活DNA手…

中国倒数第五!毕马威全球自动驾驶报告|附下载

来源:智东西概要:指向高效、安全的自动驾驶被认为是未来汽车形态,渐渐融入到各国汽车发展战略中去,科技公司和传统车企纷纷入局。指向高效、安全的自动驾驶被认为是未来汽车形态,渐渐融入到各国汽车发展战略中去&#…

潘建伟团队进行人类首次洲际量子通信,给奥地利发去了什么?

来源:澎湃新闻概要:世界首颗量子通信实验卫星完成目标;世界首条量子保密通信“京沪干线”开通;世界首次洲际量子通信……世界首颗量子通信实验卫星完成目标;世界首条量子保密通信“京沪干线”开通;世界首次…

《人工智能标准化白皮书(2018版)》发布|附下载

来源:光明网概要:1月18日下午,2018人工智能标准化论坛在京召开,本次论坛发布了《人工智能标准化白皮书(2018版)》。1月18日下午,2018人工智能标准化论坛在京召开,本次论坛发布了《人…

matlab7.0停止工作,matlab7.0闪退是怎么回事_matlab7.0闪退怎么办

描述兼容性引起的matlab7.0闪退1、在桌面的matlab图标上点击右键,选择“属性”2、选择“兼容性”3、勾选“以兼容模式运行这个程序”,再选择“Windows2000”4点击“确定”matlab7.0闪退的解决办法1)如果不是Intel的CPU,要添加环境变量--〉系统…

贝叶斯机器学习前沿进展

来源:人机与认知实验室概要:随着大数据的快速发展,以概率统计为基础的机器学习在近年来受到工业界和学术界的极大关注,并在视觉、语音、自然语言、生物等领域获得很多重要的成功应用。摘要 随着大数据的快速发展,以概率…

数据库事务的概念及其实现原理

目录 1. 认识事务 1.1 为什么需要数据库事务1.2 什么是数据库事务1.3 事务如何解决问题1.4 事务的ACID特性以及实现原理概述2.并发异常与并发控制技术 2.1 常见的并发异常2.2 事务的隔离级别2.3 事务隔离性的实现——常见的并发控制技术 2.3.1 基于封锁的并发控制2.3.2 基于时…

Fast.ai推出NLP最新迁移学习方法「微调语言模型」,可将误差减少超过20%!

原文来源:arxiv作者:Jeremy Howard、Sebastian Ruder「雷克世界」编译:嗯~是阿童木呀可以这样说,迁移学习已经促使计算机视觉领域发生了具有革命性的变化,但对于自然语言处理(NLP)中的现有方法来…

Spring Data JPA事务管理

1、事务基础概念_四大特性 数据库中事务的四大特性(ACID),如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性: ⑴ 原子性(Atomicity) 原子性,是指事务包含的所有…

教育部发文:AI、算法等2018年进入全国高中课程!

来源:全球人工智能概要:1月16日上午,教育部召开新闻发布会,介绍了《普通高中课程方案和语文等学科课程标准(2017年版)》的有关情况,并重新修订了语文等14门学科的课程标准。1月16日上午&#xf…

JPA事务示例分析

在这个工程中,定义一个名为User的实体: Entity Data NoArgsConstructor public class User {IdGeneratedValueprivate Long id;Size(max 5)private String name;Max(50)private Integer age;public User(String name, Integer age) {this.name name;t…

智能零售来了!Amazon Go无人商店周一正式对公众开放

来源:网络大数据概要:经过近 14 个月只对亚马逊公司员工开放的试运行,周一这家标着 Amazon Go 标志的店面将公开亮相,这是亚马逊近年来投入最多努力的项目之一,旨在重塑实体购物的体验。据《西雅图时报》报道&#xff…

看懂GE Predix ,就看懂了工业互联网

来源:小黑羊JoinWings概要:Predix是GE推出的针对整个工业领域的基础性系统平台,这是一个开放的平台,它可以应用在工业制造、能源、医疗等各个领域。Predix是GE推出的针对整个工业领域的基础性系统平台,这是一个开放的平…

JPA和事务管理

1 事务 1.1事务管理方式 spring支持编程式事务管理和声明式事务管理两种方式。 编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。对于编程式事务管理,spring推荐使用TransactionTemplate。 声明式事务管理建立在AOP之上的…

纽约大学Gary Marcus发文指出AlphaZero「被夸大」,强调重视人工智能「先天因素」

原文来源:arXiv作者:Gary Marcus「雷克世界」编译:嗯~是阿童木呀纽约大学Gary Marcus教授一直是深度学习的反对者,他认为深度学习并没有主动学习能力,且鲁棒性较差。同时,他始终认为人工智能应该多在“先天…

oracle10g新建数据,Oracle10g手工创建数据库

【注:本文中所有$表示在oracle用户中操作的命令、SQL>表示所有SQL语句】手工建库步骤:1、删除原有的数据库,如TEST命令:SQL> shutdown immediate;SQL> startup mount;SQL> alter system enable restricted session;SQ…

展望:模型驱动的深度学习

来源:《国家科学评论》概要:近年来,深度学习在人工智能领域一系列困难问题上取得了突破性成功应用。模型驱动的深度学习方法近年来,深度学习在人工智能领域一系列困难问题上取得了突破性成功应用。例如用于人脸识别已高于人的正确…