服务启动端口冲突解决方案
报错信息:Address already in use
Step1:修改启动端口执行server.port
Step2:lsof -i:端口 或 netstat -anp|grep 端口 ==>找到启动端口对应的服务进程pid
使用kill -9 pid 执行进程pid强杀
强杀严重问题讲解
比如一些服务或对象在进行通道连接,文件输入输入出等。这种情况是不能使用强杀的。强杀就类似电脑你突然把电拔了。你想啊,服务器正在修改一些文件,你突然强杀,这些文件就没有保存
Step3: kill -15配合ShutdownHook实现优雅关闭
kill命令 Linux 中 kill 指令负责杀死进程,其后可以紧跟⼀个数字,代表信号编号(Signal)
kill -l
HUP INT QUIT ILL TRAP ABRT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM
STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH POLL
PWR SYS
Java进程优雅关闭的意义
关闭 socket 链接
清理临时⽂件
发送消息通知给订阅⽅,告知⾃⼰下线
各种资源的释放 jerkins钩⼦ ,往git提交代码==》执⾏了⾃动化构建==》服务重启 dubbo spi的钩子
代码验证
Step1:启动类添加
public class CouponAppApplication {
public static void main(String[] args) {
SpringApplication.run(CouponAppApplication.class, args);
//执行 kill -15执行 ShutdownHook
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
@Override
public void run() {
System.out.println("执行JVM ShutdownHook");
}
}));
}
}
Step2:配置类
@Component
public class TestDisposeableBean implements DisposableBean {
@Override
public void destroy() throws Exception {
System.out.println("测试TestDisposeableBean已经销毁");
}
}
启动项目后使用 kill -15 pid杀死进程。查看结果
如果项目中有使用zookeeper,还会关闭zookeeper的一个线程。说明zookeeper也是spring shutdownhook的一种实现