Java学习系列:使用SignalHandler来处理Linux信号量,控制程序结束的步骤


最近,开发的程序是对kafka进行消费,程序开发完毕之后,发现程序的终止一直都是很简单粗暴的kill -9 pid,然后存在数据处理到一半,然后就被干掉,导致最后的结果数据只入了一半便不见了。所以,就这样产生了一个需求:当要结束程序的时候,告知程序要结束了,并等待一些资源的处理完毕和稀缺资源的安全释放。


正文
接下来就进去实操环节了,请各位看官接着往下看。

SignalHandler类的编写
我们需要编写一个类来继承sun.misc.SignalHandler,并编写接收到Signal的时候,需要执行的步骤。接下来我展示一个样例代码:

@Slf4j
public class MqKillHandler  implements SignalHandler {

    private ScanMain scanMain;

    public MqKillHandler(ScanMain scanMain) {
        this.scanMain= scanMain;
    }

    /**
     * 注册信号
     * @param signalName
     */
    public void registerSignal(String signalName) {
        Signal signal = new Signal(signalName);
        Signal.handle(signal, this);
    }

    @Override
    public void handle(Signal signal) {
        if (signal.getName().equals("TERM")) {
            // 程序关闭
            try {
                log.info("程序关闭,正在关闭相关资源");

                startScanMain.closeAllThread();

                log.info("程序关闭完毕");

                // 退出程序
                System.exit(0);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}



SignalHandler类的绑定
编写了SignalHandler类之后,就需要在程序里面调用并绑定对应的Signal的接收,代码如下:

log.info("绑定 程序关闭信号,实现程序正常关闭 ");
// 设置 程序关闭线程
MqKillHandler mqKillHandler = new MqKillHandler(this);
mqKillHandler.registerSignal("TERM");



执行脚本
接下来,启动脚本之后,我们等待运行一段时间之后,执行以下脚本:

kill -15 $pid

说明
15就是对应的信号量,代表SIGTERM,就是本文程序里面指定的信号量。下面是官网的解释:

SIGTERM - This signal requests a process to stop running. This signal can be ignored. The process is given time to gracefully shutdown. When a program gracefully shuts down, that means it is given time to save its progress and release resources. In other words, it is not forced to stop. SIGINT is very similar to SIGTERM.

结果
执行kill命令之后,从下面的截图可以得出,我们的程序是成功地达到了目标,有计划地将资源进行释放,比较完善地终止了我们的程序。


参考链接
man1/kill.1(kill(1) - Linux manual page)
list-of-kill-signals (List of Kill Signals - Unix & Linux Stack Exchange)
signal (signal(7) - Linux manual page)
kill-commands-and-signals (Kill Commands and Signals | Linux.org)

总结
一些程序需要有步骤地进行资源结束,否则会造成资源浪费和数据丢失。根据linux内部机制的信号量和Java提供的SignalHandler类来处理这些事情,简单快捷高效。
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值