V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ROMANLIU
V2EX  ›  Java

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

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

    你说的“SprintBoot 项目”、“前面的 Java 项目”是一码事吗?
    ROMANLIU
        3
    ROMANLIU  
    OP
       2023-04-17 18:39:28 +08:00 via iPhone
    @julyclyde 一回事的。遇到了并发启动的问题..
    julyclyde
        4
    julyclyde  
       2023-04-17 19:03:36 +08:00
    @ROMANLIU 那可能需要互斥一下
    建议还是用 systemd 来管理
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5398 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 06:00 · PVG 14:00 · LAX 22:00 · JFK 01:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.