在开发中,遇到一个问题。我们每次重启一个应用的时候,总会导致一些正在执行的任务因为机器突然死掉,如果不对这种正在执行的任务记录,处理的话,这些任务就消失了。在重启那个时刻jvm里所发生的所有事情我们都已无所知。这会导致什么样的后果,很难知道。发生的后果也难以管理。所以必须对这种情况进行监控,处理。
package com.ms;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong;
public class Test {
public static void main(String[] args) {
AtomicLong cnt = new AtomicLong();
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
// to insert db
System.err.println("保存cnt到数据库" + cnt);
}
});
Thread t = new Thread(new Runnable() {
@Override
public void run() {
while(true) {
cnt.incrementAndGet();
System.err.println(cnt);
try {
TimeUnit.SECONDS.sleep(1);
}
catch(InterruptedException e) {
e.printStackTrace();
}
}
}
});
t.start();
try {
TimeUnit.SECONDS.sleep(5);
System.exit(0);
}
catch(InterruptedException e) {
e.printStackTrace();
}
}
}
运行结果:
1
2
3
4
5
保存cnt到数据库5
以上demo简单的使用钩子函数实现了在程序退出时将数据入库的逻辑。
注意:程序退出是指System.exit(0); 也就是正常的程序退出,如果使用类似kill -9的杀进程方式,钩子函数式不起作用的,也不会被调用到。