java shutdown hook_Java利用ShutDownHook关闭系统资源

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时关闭系统

/**

*

类描写叙述: 输入Enter键关闭系统

*

创建人:王成委

*

创建时间:2015年6月8日 下午5:23:31

*/

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的一些处理。

//此方法须要声明void。而且没有不论什么參数

public void destroy(){

logger.info("Stop socket handler.");

}

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

/**

*

类描写叙述: 系统关闭钩子,用于关闭Spring资源

*

创建人:王成委

*

创建时间:2015年6月8日 下午5:06:46

*/

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

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

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

如有雷同。请勿见怪。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值