Spring Boot 生成 pid 文件

本文将介绍 Spring Boot 应用启动时自动创建 pid 文件,然后利用 pid 文件实现 Spring Boot 应用的停止。

当前使用 Spring Boot 快速开发应用已成为主流,Spring Boot 应用打包出来通常是一个可执行的 jar 文件。每次运行应用我们都需要使用 java -jar demo_app.jar 的方式去运行,这是非常麻烦的。

本文将介绍怎样通过命令行脚本去启动和停止 Spring Boot 应用,这里停止 Spring Boot 应用借助了 pid 文件。具体步骤如下:

(1)先看看我们的应用目录结构,如下图:

Spring Boot 生成 pid 文件

上图中,各个文件和目录作用如下:

  • config 目录用来存放应用的配置文件

  • logs 目录用来存放应用日志信息

  • jre1.8 则是存放的一个可以使用的 jre 运行环境,该 jre 通常将我们开发应用时使用的 jre 环境拷贝出来,这样可以避免发布到某台机器没有安装 jdk,或者没有配置 java 环境变量等问题,也能避免开发和实际运行的 jdk 版本不一致导致的兼容等等一系列问题,通常这个 jre 目录有接近 200MB 大小

  • demo-app.jar 则是应用的可执行 jar 文件

  • start.bat 是应用启动脚本 

  • stop.bat 是应用停止脚本

(2)修改 Spring Boot 应用的启动类,在启动类中通过添加 ApplicationPidFileWriter 监听器实现应用启动时在当前目录下创建 application.pid 文件,代码如下:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.system.ApplicationPidFileWriter;
import org.springframework.boot.web.support.SpringBootServletInitializer;
import org.springframework.context.annotation.ComponentScan;

/**
 * Spring Boot 项目启动类
 * @author hxstrive.com
 */
@SpringBootApplication
public class DemoApplication extends SpringBootServletInitializer {

    public static void main(String[] args) {
        SpringApplication springApplication = new SpringApplication(DemoApplication.class);
        springApplication.addListeners(new ApplicationPidFileWriter());
        springApplication.run(args);
    }

}

(3)start.bat 脚本

@echo off
setlocal
set current_dir=%~dp0
set basePath=%current_dir:~0,-1%
rem 复制一个java.exe且命名为demo-app.exe是为了方便监测服务进程
set java_exe=demo-app.exe
rem 服务的jar文件名
set jar_name=demo-app.jar

if not "%demo_home%" == "" goto gotHome
set "demo_home=%basePath%\.."
:gotHome

rem 判断当前服务主目录下是否存在 java.exe
if not exist %demo_home%\jre1.8\bin\java.exe (
    echo not found java.exe
    goto error_end
)

rem 判断demo-app.exe是否存在,不存在则复制一个java.exe且命名为demo-app.exe
if not exist %demo_home%\jre1.8\bin\%java_exe% (
    echo create %java_exe% file
    copy /y %demo_home%\jre1.8\bin\java.exe %demo_home%\jre1.8\bin\%java_exe%
)

rem 通过 -Xbootclasspath 将 config 目录指定为 Spring Boot 的配置目录
start "demo_server" %demo_home%\jre1.8\bin\%java_exe% -Xbootclasspath/a:%basePath%\config -jar %jar_name%
goto end
:error_end
pause
:end

(4)stop.bat 脚本

@echo off
setlocal
set basePath=%~dp0

if not "%demo_home%" == "" goto gotHome
set "demo_home=%basePath%\.."
:gotHome

if not exist %basePath%\application.pid (
    echo not found application.pid
    goto end
)

rem 根据进程PID结束进程
set /p pid=<%basePath%\application.pid
taskkill /f /pid %pid%
echo success shutdown demo_server.
rem 服务结束后,删除pid文件
del %basePath%\application.pid /q

:end
pause

Spring Boot 配置外部化,请参考“外部配置化”。

睡眠和休息丧失了时间,却取得了明天工作的精力。 —— 毛泽东
0 不喜欢
说说我的看法 -
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
其他应用
公众号