Java关闭钩子的应用 - Shutdown Hook】的更多相关文章

背景 在开发中,遇到这种情况,多个线程同时工作,突然一个线程遇到了fetal的错误,需要立即终止程序,等人工排查解决了问题之后重新启动.但是这样会有一个问题,程序终止时,其他线程可能正在进行重要操作,比如发一个message到另一个模块,并更新数据库状态.突然终止,可能会让这个操作只完成一半,从而导致数据不一致. 解决方案是:参考数据库Transaction原子性的概念,将这一系列重要操作看作一个整体,要么全部完成,要么全部不完成.为方便表述,我们把这一系列重要操作记为操作X. 当程序即将退出时…
Runtime.getRuntime().addShutdownHook(shutdownHook); 说明:这个方法的意思就是在jvm中增加一个关闭的钩子,当jvm关闭的时候,会执行系统中已经设置的所有通过方法addShutdownHook添加的钩子,当系统执行完这些钩子后,jvm才会关闭.所以这些钩子可以在jvm关闭的时候进行内存清理.对象销毁等操作. 用途 1应用程序正常退出,在退出时执行特定的业务逻辑,或者关闭资源等操作. 2虚拟机非正常退出,比如用户按下ctrl+c.OutofMemo…
JAVA的关闭钩子: 1. 一般应用程序在关闭时都需要做一些善后清理工作,但是用户并不会总是按照推荐的方法关闭应用程序,比如用户直接关闭控制台程序或者按下Ctrl+C结束应用程序,这样就导致清理工作得不到执行,为此JVM提供了关闭钩子,在用户强制虚拟机中断运行时,JVM会并发执行所有的关闭钩子,直到完成任务:2. 创建关闭钩子的步骤: 1).创建Thread类的一个子类: 2).实现run方法,在run方法中执行善后清理工作: 3).实例化关闭钩子对象: 4).使用Runtime.getRunt…
在很多实际应用环境中,当用户关了应用程序时,需要做一些善后清理工作,但问题是,用户有时并不会按照推荐的方法关闭应用程序,很有可能不做清理工作,例如在Tomcat的部署应用中,通过实例化一个Server对象来启动servlet容器,并调用其start方法,然后逐个调用组件的start方法,正常情况下,为了让Server对象能够关闭这些已经启动的组件,你应该向指定的端口发送关闭命令,如果你只是简单的突然退出,例如在应用程序过程中关闭控制台,可能会发生一些意想不到的事情. 幸运的是,java为程序员提…
我是陈皮,一个在互联网 Coding 的 ITer,微信搜索「陈皮的JavaLib」第一时间阅读最新文章,回复[资料],即可获得我精心整理的技术资料,电子书籍,一线大厂面试资料和优秀简历模板. 背景 如果想在 Java 进程退出时,包括正常和异常退出,做一些额外处理工作,例如资源清理,对象销毁,内存数据持久化到磁盘,等待线程池处理完所有任务等等.特别是进程异常挂掉的情况,如果一些重要状态没及时保留下来,或线程池的任务没被处理完,有可能会造成严重问题.那该怎么办呢? Java 中的 Shutdow…
Runtime.getRuntime().addShutdownHook(shutdownHook);    这个方法的含义说明:        这个方法的意思就是在jvm中增加一个关闭的钩子,当jvm关闭的时候,会执行系统中已经设置的所有通过方法addShutdownHook添加的钩子,当系统执行完这些钩子后,jvm才会关闭.所以这些钩子可以在jvm关闭的时候进行内存清理.对象销毁等操作.   用途 1应用程序正常退出,在退出时执行特定的业务逻辑,或者关闭资源等操作. 2虚拟机非正常退出,比如…
程序经常也会遇到进程挂掉的情况,一些状态没有正确的保存下来,这时候就需要在JVM关掉的时候执行一些清理现场的代码.JAVA中的ShutdownHook提供了比较好的方案. JDK提供了Java.Runtime.addShutdownHook(Thread hook)方法,可以注册一个JVM关闭的钩子,这个钩子可以在一下几种场景中被调用: 程序正常退出 使用System.exit() 终端使用Ctrl+C触发的中断 系统关闭 OutOfMemory宕机 使用Kill pid命令干掉进程(注:在使用…
DK1.3介绍了java.lang.Runtime class的addShutdownHook()方法.如果你需要在你的程序关闭前采取什么措施,那么关闭钩子(shutdown hook)是很有用的. JDK1.3介绍了java.lang.Runtime class的addShutdownHook()方法.如果你需要在你的程序关闭前采取什么措施,那么关闭钩子(shutdown hook)是很有用的. 要加关闭钩子(shutdown hook),需要先创建一个java.lang.Thread 类的实…
Shutdown Hook Java程序经常也会遇到进程挂掉的情况,一些状态没有正确的保存下来,这时候就需要在JVM关掉的时候执行一些清理现场的代码.JAVA中的ShutdownHook提供了比较好的方案. JDK提供了Java.Runtime.addShutdownHook(Thread hook)方法,可以注册一个JVM关闭的钩子,这个钩子可以在一下几种场景中被调用: 程序正常退出 使用System.exit() 终端使用Ctrl+C触发的中断 系统关闭 OutOfMemory宕机 使用Ki…
Java程序经常也会遇到进程挂掉的情况,一些状态没有正确的保存下来,这时候就需要在JVM关掉的时候执行一些清理现场的代码. JAVA中的ShutdownHook提供了比较好的方案. JDK提供了Java.Runtime.addShutdownHook(Thread hook)方法,可以注册一个JVM关闭的钩子,这个钩子可以在一下几种场景中被调用: 1. 程序正常退出 2. 使用System.exit() 3. 终端使用Ctrl+C触发的中断 4. 系统关闭 5. OutOfMemory宕机 6.…
1.功能 在jvm中添加关闭钩子(Runtime.getRuntime().addShutdownHook(shutdownHook);)后,当jvm关闭时会执行系统中已经设置的所有通过该方法添加的钩子,系统执行完这些钩子后,jvm才会关闭.所以这些钩子可以在jvm关闭的时候进行内存清理.对象销毁.关闭I/O资源等操作. 2.示例 示例1及输出: package cn.edu.buaa.jvmhook; /** * Runtime.getRuntime().addShutdownHook(shu…
转 http://501565246-qq-com.iteye.com/blog/1733575 21,tomcat关闭钩子 博客分类: tomcat   在很多环境下,在关闭应用程序的时候需要做一些清理工作.问题在于,用户并不是经常的按照要求的流程来退出Java提供了一种优雅的方式供程序员来使用,这样可以保证清理代码的执行.使用一个关闭钩子(shutdown hool)来保证清理代码一定会被执行.在Java中,虚拟机遇到两种事件的时候会关闭虚拟机:· 应用程序正常退出如System.exit方…
最近测试环境上测试的项目通过shutdown.sh始终无法彻底关闭. 之前临时解决方法两种: 第一:通过ps -ef|grep tomcat查看到tomcat的进程直接使用kill来杀死进程. 第二: 基本原理为启动tomcat时记录启动tomcat的进程id(pid),关闭时强制杀死该进程 1.找到tomcat下bin/catalina.sh文件,vi进去添加点东西,主要是记录tomcat的pid,如下: 大概在第125行左右,添加如下代码 #设置CATALINA_PID(后加)if [ -z…
通过两种方式可以关闭一个socket:close和shutdown.直接调用close关闭socket存在以下两个问题: 1. close只是将socket 描述字的访问计数减1,仅当描述字的访问计数为0时,才真正的关闭socket. 2.close终止了数据传输的两个方向:读与写.tcp管道是全双工的,有时候我们仅仅是想通知另一端我们已经完成了数据的发送,但还想继续接收另一端发送过来的数据,在这种情况下调用close关闭socket是不合适的. shutdown可以解决上面关于close的两个…
在学习selenium的过程中发现一个问题,各种博客/教程都是教人用selenium的quit()和close()方法关闭浏览器. 但这不是我要的结果.这两个方法的前提是,用webdriver打开浏览器,执行脚本之后再关闭已经用webdriver打开的浏览器. 我的前提条件:在用webdriver打开浏览器之前先检查是否有浏览器已经打开,如果有,先关闭这些浏览器,然后执行webdriver脚本. 这个也是借鉴于HP QTP(HP UFT),当初QTP遇到已经有浏览打开就不知道哪个浏览器是它要运行…
Java代码: package Threads; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.Socket; /** * Created by Frank */ public class StopClose extends Thread { protected Socket io; public void run() { t…
Java之前有一个api方法可以直接关闭线程,stop(),由于这个方法是强制性地关闭线程,有的时候会发生错误,之后就取消了,现在可用的方法主要有两种: 1.  在线程中加入一个成员变量,当一个flag使用.在线程run()方法中轮流去检查这个变量,变量变化时就退出这个线程.代码示例如下: public class StopThread extends Thread {     private boolean _run = true;     public void stopThread(boo…
在网上看到一篇关于关闭资源的正确方式:http://blog.csdn.net/bornforit/article/details/6896775 该博文中的总结: (1)使用finally块来关闭物理资源(非托管资源),保证关闭操作始终会被执行: (2)关闭每个资源之前首先保证引用该资源的引用变量不为null: (3)为每个物理资源使用单独的trycatch块关闭资源,保证关闭资源时引发的异常不会影响其他资源的关闭. 在资源过多的时候,我们要在finally块中写很多的非空判断.以及try-c…
关闭流文件和file文件的时候,先打开的后关闭,后打开的先关闭,实在不行调用system.jc()方法…
public class ShutdownHook { private static final ShutdownHook INSTANCE = new ShutdownHook(); private List<ExecutorService> executorServices = Lists.newArrayList(); private AtomicBoolean closed = new AtomicBoolean(false); public static ShutdownHook g…
SparkContext可以说是Spark应用的发动机引擎,Spark Drive的初始化围绕这SparkContext的初始化. SparkContext总览 sparkcontxt的主要组成部分 sparkEnv:spark运行环境,Executor是处理任务的执行器,依赖于SparkEnv的环境.Driver中也包含SparkEnv,为了保证Local模式下任务执行.此外,SparkEnv还包含serializerManager.RpcEnv.BlockManager.mapOutputT…
Java关闭钩子 在Java程序中能够通过加入关闭钩子,实如今程序退出时关闭资源的功能. 使用Runtime.addShutdownHook(Thread hook)向JVM加入关闭钩子 public void addShutdownHook(Thread hook) { SecurityManager sm = System.getSecurityManager(); if (sm != null) { sm.checkPermission(new RuntimePermission("shu…
原文出处:http://kim-miao.iteye.com/blog/1662550.感谢作者的无私分享. 一.Runtime.addShutdownHook理解 在看别人的代码时,发现其中有这个方法,便顺便梳理一下. void java.lang.Runtime.addShutdownHook(Thread hook) 该方法用来在jvm中增加一个关闭的钩子.当程序正常退出,系统调用 System.exit方法或虚拟机被关闭时才会执行添加的shutdownHook线程.其中shutdownH…
Overview source采集的日志首先会传入ChannelProcessor, 在其内首先会通过Interceptors进行过滤加工,然后通过ChannelSelector选择channel. Source和Sink之间是异步的,sink只需要监听自己关系的Channel的变化即可. sink存在写失败的情况,flume提供了如下策略: 默认是一个sink,若写入失败,则该事务失败,稍后重试. 故障转移策略:给多个sink定义优先级,失败时会路由到下一个优先级的sink.sink只要抛出一…
1.在wind系统下载tomcat,tomcat8版本的需要jdk1.8以上的才支持. 下载位置:http://tomcat.apache.org/download-80.cgi -> core -> tar.gz(pgp.md5.sha1) 2.上传到虚拟机上的Linux系统,要用到一个wind与Linux之间专门传输文件的工具windscp; 下载windscp->新建会话->输入主机名(即虚拟机IP地址),用户名和密码:连接上后选择要上传的文件,点击上传到指定的目录里: 3.…
Java没有提供任何机制来安全地终止线程,虽然Thread.stop和suspend等方法提供了这样的机制,但是存在严重的缺陷,应该避免使用这些方法.但是Java提供了中断Interruption机制,这是一种协作机制,能够使一个线程终止另一个线程的当前工作. 这种协作方式是必要的,我们很少希望某个任务线程或者服务立即停止,因为这种立即停止会时某个共享的数据结构处于不一致的状态.相反,在编写任务和服务的时候可以使用一种协作方式:当需要停止的时候,它们会先清除当前正在执行的工作,然后再结束. 7.…
    Java没有提供不论什么机制来安全地(抢占式方法)终止线程,尽管Thread.stop和suspend等方法提供了这种机制,可是因为存在着一些严重的缺陷,因此应该避免使用. 但它提供了中断Interruption机制,这是一种协作机制,可以使一个线程终止还有一个线程的当前工作. 一.任务取消 取消操作的原因: . 用户请求取消 . 有时间限制的操作 . 应用程序事件 . 错误 . 关闭 结束任务的四种方式: 1. run方法运行结束 2. 使用请求关闭标记(比如boolean开关) 3.…
很多时候应用服务启动或关闭会做一些预加载(比如缓存,定时任务启动等)或收尾处理工作(比如程序失败记录等) 1. 首先看下Spring框架服务启动加载操作实现,直接上代码 继承实现接口ApplicationListener就可以实现: import com.today.service.financereport.action.ExportReportRecordFailureActionimport com.today.service.financereport.common.ReportThre…
https://tech.imdada.cn/2017/06/18/jvm-safe-exit/?utm_source=tuicool&utm_medium=referral 背景 用户:货都到了,购物车里怎么还有刚买的东西,what?产品:有用户反映,提单完成了,怎么没清购物车,研发赶紧看看是不是有bug啊?研发:恩,我看看,!@#¥%……&*()一顿狂查,搜嘎,当时在上线,重启应用,异步任务丢了……产品:能不能行,上线你就丢任务,丢不丢人啊!研发:………… 上线!重启!你还在为丢失任务…
资料出处: http://www.sohu.com/a/329564560_700886 https://www.cnblogs.com/nuccch/p/10903162.html 前言 Linux系统下如何kill掉一个后台Java进程,相信童鞋们都知道如何操作.首先使用ps命令查找该Java进程的进程ID,然后使用kill命令进行杀掉.命令如下: (1)ps查进程ID [user@data2 ~]$ ps -ef | grep Test user 2095020809 0 21:30 pt…