Java关闭钩子

在Java程序中能够通过加入关闭钩子,实如今程序退出时关闭资源的功能。

使用Runtime.addShutdownHook(Thread hook)向JVM加入关闭钩子

    public void addShutdownHook(Thread hook) {
SecurityManager sm = System.getSecurityManager();
if (sm != null) {
sm.checkPermission(new RuntimePermission("shutdownHooks"));
}
ApplicationShutdownHooks.add(hook);
}

ShutdownHook(Thread hook)方法,能够注冊一个JVM关闭的钩子,这个钩子能够在以下几种场景被调用:

1)程序正常退出

2)使用System.exit()

3)终端使用Ctrl+C触发的中断

4)系统关闭

5)使用Kill pid命令干掉进程

在Eclipse中使用关闭钩子

在Eclipse中直接点击Terminate关闭程序时不会触发关闭钩子的。

在Linux下使用kill -9也是不会触发钩子的

假设想在Eclipse中实现关闭钩子的功能,须要另起一个线程监听控制台,在控制台输入Enter时关闭系统

/**
* <p>类描写叙述: 输入Enter键关闭系统 </p>
* <p>创建人:王成委 </p>
* <p>创建时间:2015年6月8日 下午5:23:31 </p>
*/
public class ExitThread extends Thread {
private Log logger = LogFactory.getLog(getClass()); public void run() {
logger.info("press ENTER to call System.exit(0) ");
try {
System.in.read();
} catch (IOException e) {
e.printStackTrace();
}
System.exit(0);
} }

Spring中关闭资源的配置

在使用Spring时。能够在Bean中配置destroy-method来实现系统关闭时对Bean的一些处理。

    <bean id="simpleHandler" class="com.tiamaes.gjds.socket.server.SimpleHanlder" destroy-method="destroy">
<property name="annotationSocketServiceFactory" ref="annotationSocketServiceFactory" />
</bean>
    //此方法须要声明void。而且没有不论什么參数
public void destroy(){
logger.info("Stop socket handler.");
}

Java+Spring实如今程序退出时关闭Spring

/**
* <p>类描写叙述: 系统关闭钩子,用于关闭Spring资源 </p>
* <p>创建人:王成委 </p>
* <p>创建时间:2015年6月8日 下午5:06:46 </p>
*/
public class ShutDownHook extends Thread { private Log logger = LogFactory.getLog(getClass()); private ConfigurableApplicationContext applicationContext; public ShutDownHook(ConfigurableApplicationContext applicationContext ){
super();
this.applicationContext = applicationContext;
} @Override
public void run() {
logger.info("Start clean the login info.");
//在系统关闭时,清理全部用户的登录状态
TbDxpUserLoginStatusRepository repository = applicationContext.getBean(TbDxpUserLoginStatusRepository.class);
repository.deleteAll();
applicationContext.close();
logger.info("Socket server shutdown");
}
}

在ShutdownHook实例化时须要传入Spring上下文,在系统关闭时调用ApplicationContext的Close方法。

    public static void main(String[] args) {
ClassPathXmlApplicationContext ct =
new ClassPathXmlApplicationContext("applicationContext.xml"); Runtime.getRuntime().addShutdownHook(new ShutDownHook(ct)); //在正式部署时不须要以下的代码,这段代码仅供调试时使用
Thread thread = new ExitThread();
thread.start();
}

终于效果例如以下

2015-06-09 09:43:51,233 INFO ClassPathXmlApplicationContext  - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@2e52cdcc: startup date [Tue Jun 09 09:43:51 CST 2015]; root of context hierarchy
2015-06-09 09:43:52,263 INFO XmlBeanDefinitionReader - Loading XML bean definitions from class path resource [applicationContext.xml]
2015-06-09 09:43:55,559 INFO XmlBeanDefinitionReader - Loading XML bean definitions from class path resource [applicationContext-service.xml]
2015-06-09 09:43:55,724 INFO XmlBeanDefinitionReader - Loading XML bean definitions from class path resource [applicationContext-db.xml]
2015-06-09 09:44:01,358 INFO PropertyPlaceholderConfigurer - Loading properties file from class path resource [jdbc.properties]
2015-06-09 09:44:02,687 INFO MLog - MLog clients using slf4j logging.
2015-06-09 09:44:06,563 INFO C3P0Registry - Initializing c3p0-0.9.5-pre9 [built 08-October-2014 03:06:08 -0700; debug? true; trace: 10]
2015-06-09 09:44:08,930 INFO LocalContainerEntityManagerFactoryBean - Building JPA container EntityManagerFactory for persistence unit 'Oracle'
2015-06-09 09:44:09,251 INFO LogHelper - HHH000204: Processing PersistenceUnitInfo [
name: Oracle
...]
2015-06-09 09:44:13,400 INFO Version - HHH000412: Hibernate Core {4.3.7.Final}
2015-06-09 09:44:13,404 INFO Environment - HHH000206: hibernate.properties not found
2015-06-09 09:44:13,439 INFO Environment - HHH000021: Bytecode provider name : javassist
2015-06-09 09:44:15,016 INFO Version - HCANN000001: Hibernate Commons Annotations {4.0.5.Final}
2015-06-09 09:44:15,660 INFO Dialect - HHH000400: Using dialect: org.hibernate.dialect.Oracle10gDialect
2015-06-09 09:44:15,739 INFO LobCreatorBuilder - HHH000422: Disabling contextual LOB creation as connection was null
2015-06-09 09:44:16,056 INFO ASTQueryTranslatorFactory - HHH000397: Using ASTQueryTranslatorFactory
2015-06-09 09:44:21,032 INFO EhCacheManagerFactoryBean - Initializing EhCache CacheManager
2015-06-09 09:44:21,977 INFO ExitThread - press ENTER to call System.exit(0) 2015-06-09 09:54:23,694 INFO ShutDownHook - Start clean the login info.
2015-06-09 09:54:23,787 INFO AbstractPoolBackedDataSource - Initializing c3p0 pool... com.mchange.v2.c3p0.ComboPooledDataSource [ acquireIncrement -> 5, acquireRetryAttempts -> 0, acquireRetryDelay -> 1000, autoCommitOnClose -> true, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 5000, connectionCustomizerClassName -> null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, contextClassLoaderSource -> caller, dataSourceName -> 1hge7dt991ndh1jygiycad|7402fff0, debugUnreturnedConnectionStackTraces -> false, description -> null, driverClass -> oracle.jdbc.OracleDriver, extensions -> {}, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, forceUseNamedDriverClass -> false, identityToken -> 1hge7dt991ndh1jygiycad|7402fff0, idleConnectionTestPeriod -> 0, initialPoolSize -> 5, jdbcUrl -> jdbc:oracle:thin:@192.168.57.62:1521:orcl, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 36000, maxIdleTimeExcessConnections -> 1800, maxPoolSize -> 20, maxStatements -> 0, maxStatementsPerConnection -> 0, minPoolSize -> 5, numHelperThreads -> 3, preferredTestQuery -> null, privilegeSpawnedThreads -> false, properties -> {user=******, password=******}, propertyCycle -> 0, statementCacheNumDeferredCloseThreads -> 0, testConnectionOnCheckin -> false, testConnectionOnCheckout -> false, unreturnedConnectionTimeout -> 0, userOverrides -> {}, usesTraditionalReflectiveProxies -> false ]
Hibernate: select tbdxpuserl0_.SESSION_ID as SESSION_ID1_1_, tbdxpuserl0_.CREATE_TIME as CREATE_TIME2_1_, tbdxpuserl0_.IP_ADDR as IP_ADDR3_1_, tbdxpuserl0_.LOGIN_TIME as LOGIN_TIME4_1_, tbdxpuserl0_.status as status5_1_, tbdxpuserl0_.USER_ID as USER_ID6_1_, tbdxpuserl0_.username as username7_1_ from TB_DXP_USER_LOGIN_STATUS tbdxpuserl0_
2015-06-09 09:54:25,555 INFO ClassPathXmlApplicationContext - Closing org.springframework.context.support.ClassPathXmlApplicationContext@2e52cdcc: startup date [Tue Jun 09 09:43:51 CST 2015]; root of context hierarchy
2015-06-09 09:54:25,556 INFO EhCacheManagerFactoryBean - Shutting down EhCache CacheManager
2015-06-09 09:54:25,574 INFO SimpleHanlder - Stop socket handler.
2015-06-09 09:54:25,576 INFO LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'Oracle'
2015-06-09 09:54:25,579 INFO ShutDownHook - Socket server shutdown

此方法能够实如今系统退出时对资源的关闭及缓存数据清理等功能。是一个很使用的功能。

文中部分内容来自其它博文,代码是我项目中的代码。

如有雷同。请勿见怪。

本文仅仅介绍怎样使用。至于原理请问度娘和谷歌

Java利用ShutDownHook关闭系统资源的更多相关文章

  1. 【Java】Java-ShutDownHook-优雅关闭系统资源

    Java-ShutDownHook-优雅关闭系统资源 java shuadownhook_百度搜索 Java应用中使用ShutdownHook友好地清理现场 - 残雪余香 - 博客园 java kil ...

  2. Java利用POI导入导出Excel中的数据

         首先谈一下今天发生的一件开心的事,本着一颗android的心我被分配到了PB组,身在曹营心在汉啊!好吧,今天要记录和分享的是Java利用POI导入导出Excel中的数据.下面POI包的下载地 ...

  3. 谈谈Java利用原始HttpURLConnection发送POST数据

    这篇文章主要给大家介绍java利用原始httpUrlConnection发送post数据,设计到httpUrlConnection类的相关知识,感兴趣的朋友跟着小编一起学习吧 URLConnectio ...

  4. java:利用java的输入/输出流将一个文件的每一行+行号复制到一个新文件中去

    import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.Fi ...

  5. 【Linux】利用Xvfb关闭chrome的图形化输出

    利用Xvfb关闭chrome的图形化输出 #!/bin/bash . /home/fzuir/.profile # JAVA export JAVA_HOME=/usr/local/jdk1.7.0_ ...

  6. 【转载】 java利用snmp4j包来读取snmp协议数据(Manager端)

    https://www.cnblogs.com/xdp-gacl/p/4187089.html http://doc.okbase.net/yuanfy008/archive/265663.html ...

  7. Java利用poi生成word(包含插入图片,动态表格,行合并)

    转(小改): Java利用poi生成word(包含插入图片,动态表格,行合并) 2018年12月20日 09:06:51 wjw_11093010 阅读数:70 Java利用poi生成word(包含插 ...

  8. Redis入门和Java利用jedis操作redis

    Redis入门和Java利用jedis操作redis Redis介绍 Redis 是完全开源的,遵守 BSD 协议,是一个高性能的 key-value 数据库. Redis 与其他 key - val ...

  9. java利用JDK调用并执行js源码

    前言: 不同开发语言之间具有通用性,更具有协作调用的可能.有时候对于一些场景会有调用js的需求,因此下面展示了一个java利用自身JDK调用js函数的demo,供感兴趣的朋友参考. js函数文件 ex ...

随机推荐

  1. Python 面向对象5 多态

    一.多态 多态性(polymorphisn)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作,简单的说就是一句话:允许将 ...

  2. HDFS格式化namenode后启动集群datanode不启动

    这是因为格式化namenode之后,namenode节点中VERSION的ClusterID会改变!!! 解决办法: 1.打开namenode节点的hdfs-site.xml文件,查看你的nameno ...

  3. CSS规范 - 分类方法

    CSS文件的分类和引用顺序 通常,一个项目我们只引用一个CSS,但是对于较大的项目,我们需要把CSS文件进行分类. 我们按照CSS的性质和用途,将CSS文件分成“公共型样式”.“特殊型样式”.“皮肤型 ...

  4. Sudoku POJ - 3076 (dfs+剪枝)

    Description A Sudoku grid is a 16x16 grid of cells grouped in sixteen 4x4 squares, where some cells ...

  5. Strange Towers of Hanoi POJ - 1958(递推)

    题意:就是让你求出4个塔的汉诺塔的最小移动步数,(1 <= n <= 12) 那么我们知道3个塔的汉诺塔问题的解为:d[n] = 2*d[n-1] + 1 ,可以解释为把n-1个圆盘移动到 ...

  6. Codeforces 514C Watto and Mechanism 【Trie树】+【DFS】

    <题目链接> 题目大意:输入n个单词构成单词库,然后进行m次查询,每次查询输入一个单词(注意这些单词只由a,b,c构成),问该单词库中是否存在与当前查询的单词有且仅有一个字符不同的单词. ...

  7. c#一步一步实现ORM

    本篇适合新手了解学习orm.欢迎指正,交流学习. 现有的优秀的orm有很多. EF:特点是高度自动化,缺点是有点重. Nhibnate:缺点是要写很多的配置. drapper:最快的orm.但是自动化 ...

  8. Mybatis之注解实现动态sql

    通过注解实现动态sql一共需要三部:1.创建表,2.创建entity类,3.创建mapper类, 4.创建动态sql的Provider类.1.和2.可以参见该系列其他文章,这里主要对3和4进行演示,并 ...

  9. Xamarin SQLite教程数据库访问与生成

    Xamarin SQLite教程数据库访问与生成 在本教程中,我们将讲解如何开发SQLite相关的App.在编写程序前,首先需要做一些准备工作,如了解Xamarin数据库访问方式,添加引用,构建使用库 ...

  10. 66. 二叉树的前序遍历.md

    描述 给出一棵二叉树,返回其节点值的前序遍历. 您在真实的面试中是否遇到过这个题? 样例 给出一棵二叉树 {1,#,2,3}, 1 \ 2 / 3 返回 [1,2,3]. Binary Tree Pr ...