Java 进程只有状态为 established 的 TCP 状态

2023-04-15 14:01:06 +08:00
 ROMANLIU
项目是用 SpringBoot 写的,整个部署过程是通过在流水线上执行脚本完成的,目前已经发现可以通过一定的套路重现这个问题,但是还是有些疑惑:
项目 HTTPS 协议的端口是 7443 ,我们发现,通过脚本启动项目的时候,是有一个过程的,SpringBoot 项目启动完成后,才会有一个“完整”的 Java 进程,所谓“完整”是指通过 netstat 命令查看启动完成后的 Java 进程的 TCP 状态,其会有一个状态为 LISTENING 的 TCP 状态,监听端口为 7443 ,也就是说,启动一个 SpringBoot 程序,立即会有一个 JAVA 进程,但是离“完整”有一段时间的。
发现如果没有等待前面的 Java 项目启动完成,再次启动该 SpringBoot 项目,等待其启动完成后,有时会同时出现两个 JAVA 进程,第一个 JAVA 进程看起来“不完整”,没有 LISTENING 状态的 TCP 状态,只有一个 established 的 TCP 状态,说明有个机器和它建立了连接。第二个 JAVA 进程是“完整的”…..
1280 次点击
所在节点    Java
4 条回复
guyeu
2023-04-15 15:12:28 +08:00
所谓“完整”,大概是指代码执行到 serverSocket.listen 了。
所谓两个进程,大抵是其中一个进程占用端口后第二个进程启动失败没有正常退出了。
没有正常退出,就只好 jstack 看看哪个线程没有正常退出了。
julyclyde
2023-04-17 12:16:57 +08:00
没看明白
你这个脚本到底打算要启动几个

你说的“SprintBoot 项目”、“前面的 Java 项目”是一码事吗?
ROMANLIU
2023-04-17 18:39:28 +08:00
@julyclyde 一回事的。遇到了并发启动的问题..
julyclyde
2023-04-17 19:03:36 +08:00
@ROMANLIU 那可能需要互斥一下
建议还是用 systemd 来管理

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/932744

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX