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),英文缩…

Java获取并Kill系统进程

原理:获取系统所有进程列表,遍历,然后进行模糊匹配,将匹配到的进程杀死! 作用:保证在系统中只有一个程序进程实例。 /*** 确保系统中只有一个程序实例* 1.如果客户端启动前,操作系统中有残留进…

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

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

php保存rar,php 解压rar文件

对于zip文件网上的例子很多,rar文件解压php没有直接支持,可以用pecl 到http://pecl.php.net/package/rar 下载对应版本的 非线程安全的dll 然后扔到php的 ext目录下。 打开php.ini. 加一行 extensionphp_rar.dll 重启web服务器 和php public function _u…

ProcessBuilder执行bash脚本

我正在尝试从Java执行bash脚本,它返回错误/ bin / bash:’/ home / nika / NetBeansProjects / Parallel Framework / process-executor.sh’:没有这样的文件或目录,我正在使用ubuntu使用netbeans8& 14.04 jdk8. 这是我的代码: public …

php读取云平台数据库,读取Read · ThinkPHP5+数据库和模型 · 看云

#### Db类实现读取单个记录~~~$user Db::table(user)->where(id, 1)->find();//或者$user Db::table(user)->find(1);echo $user[id];echo $user[name];~~~模型实现读取单个记录要比Db类简单很多,而且更加符合对象的设计。~~~$user User::get(1);echo $…

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

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

Process 执行shell 脚本

概述: Process类是一个抽象类(所有的方法均是抽象的),封装了一个进程(即一个执行程序)。 Process 类提供了执行从进程输入、执行输出到进程、等待进程完成、检查进程的退出状态以及销毁(杀掉&a…

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

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

java 实现中文排序,Java自定义比较器实现中文排序

compareTo 方法compareTo()是两个字符串对象比较大小,返回一个整数值,如果调用字符串对象大,返回正整数,反之,返回负整数。相等则返回0。compareTo()是两个字符串对象按ASCII比较大小(汉字是Unicode),返回一…

java调用shell脚本及注意事项

需求: get方法下载远程zip包,然后zip包解压,取出第一级目录再次进行压缩获取新的压缩zip包。 问题: 如果选择使用java代码的IO流操作,在不确定zip包大小的情况下可能会占用很大的内存,所以选择异步调用s…

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

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

java ps old gen perm gen,ElasticSearch 的一次非正常master脱离的调查

一共有4个节点的cluster,其中es4 是master,某个时间突然es1脱离了整个cluster,调查过程如下:[esbigdata1 logs]$ date; ssh bd4 date2012年09月03日 星期一09:41:26 CST2012年09月03日 星期一09:41:00 CSTes4比es1慢26秒&#xff…

《人工智能标准化白皮书(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,要添加环境变量--〉系统…

java调用shell脚本并传递参数

最近业务上需要java调用执行shell脚本进行一些业务处理,写了个demo,记录下。 主要代码 RequestMapping("/copy/database")ResponseBodypublic String copyDatabase(HttpServletRequest request,String dbCode,String targetPath){JSONObject …

贝叶斯机器学习前沿进展

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

matlab knn,MATLAB K近邻算法 — knnsearch() 函数 | 学步园

K近邻IDX knnsearch(X,Y) finds the nearest neighbor in X for each point inY. X is an MX-by-N matrix and Y is an MY-by-N matrix. Rows of X and Ycorrespond to observations and columns correspond to variables. IDX isa column vector with MY rows. Each row in I…

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

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