数据接收程序实现优雅关闭,主要是当服务需要更新时,不强制kill掉进程,而是将队列中的数据都消费完再关掉进程。
其中队列中的数据总是源源不断的被put进来,首先需要解决的是不再接收新的数据。
所以想实现程序优雅关闭,需要执行的步骤如下:
1. 断开与代理服务器的连接
2. 查询队列中的数据大小
3. 当队列中无数据时,程序退出
程序代码:
package com.example.spring;
import com.hook.ShudownHookThread;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringstudyApplication implements CommandLineRunner {
// @Autowired
// MqttReceiveManager mqttReceiveManager;
@Override
public void run(String... strings) throws Exception {
int i = Runtime.getRuntime().availableProcessors();
long max = Runtime.getRuntime().maxMemory();
long total = Runtime.getRuntime().totalMemory();
long free = Runtime.getRuntime().freeMemory();
// 1KB(Kilobyte 千字节)=1024B
// 1MB (Megabyte 兆字节 简称“兆”)=1024KB
// 1GB (Gigabyte 吉字节 又称“千兆”)=1024MB
System.out.println("服务器核数:" + i + ",总内存(MB):" + total / 1024 / 1024 + ",最大内存(MB):" + max / 1024 / 1024 + ",剩余内存(MB):" + free / 1024 / 1024);
//注册收尾线程
Runtime.getRuntime().addShutdownHook(new ShudownHookThread());
// mqttReceiveManager.receiveMsg();
while (true) {
System.out.println("主方法执行ing");
Thread.sleep(3000);
}
}
public static void main(String[] args) {
SpringApplication.run(SpringstudyApplication.class, args);
}
}
package com.hook;
public class ShudownHookThread extends Thread {
@Override
public void run(){
System.out.println("线程收尾工作开始执行了!!!");
//此处可以进行关闭mqtt连接
//判断队列中的数据是否消费完毕
//直到消费完毕再退出
}
}
将上述代码部署到linux服务器上,并执行。
当使用kill -9 命令杀掉进程,控制台打印如下:
使用kill -15命令杀掉进程,控制台打印如下:
其中kill 命令除了9、15之外还有很多参数,总共64个,使用kill -l 命令可以查看:
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
参考博文:https://jiyiren.github.io/2018/06/18/jvm-exit/
http://www.blogjava.net/freeman1984/archive/2016/07/13/431175.html