java程序优雅关闭

数据接收程序实现优雅关闭,主要是当服务需要更新时,不强制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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值