• SpringBoot启动方式,Spring Boot 定义系统启动任务




    部分内容原文地址:

    小猴子豆芽:在Linux上发布和后台运行Springboot项目
    江南一点雨:Spring Boot 定义系统启动任务,你会几种方式?



    SpringBoot启动方式

    1.1 方法一

    1. 打包springboot项目,如:demo.jar;
    2. 将demo.jar上传到服务器;
    3. 进入demo.jar所在目录,运行命令启动jar包:java -jar demo.jar

    在本地输入服务器地址就可以访问部署的项目了,但是这种方式存在严重问题,当启动jar包的shell窗口关闭后springboot就停止了,因此该方法很少使用。

    1.2 方法二

    1. 同方法一将jar包上传到服务器;
    2. 在jar包所在目录下创建start.sh 、stop.sh和run.sh;

    1.2.1 start.sh

    #!/bin/bash
    nohup java -jar demo.jar --server.port=8084 > demo.log 2>&1 &
    

    nohup: 不挂断地运行命令,退出帐户之后继续运行相应的进程;
    server.port=8084: 配置启动端口号,此处配置的是8084,可自行修改;
    demo.log:
    指定log文件,此处在当前目录下,可自行配置到指定目录下;若不配置log文件将默认在当前目录下生成nohup.out文件;
    **2>&1:**2是标准错误,1是标准输出,该命令相当于把标准错误重定向到标准输出。这里&相当于标准错误等效于标准输出,即把标准错误和标准输出同时输出到指定的log文件中;
    结尾处&:将进程在后台运行;

    1.2.2 stop.sh

    #!/bin/bash
    PID=$(ps -ef | grep demo-0.0.1-SNAPSHOT.jar | grep -v grep | awk '{ print $2 }')
    if [ -z "$PID" ]
    then
        echo Application is already stopped
    else
        echo kill $PID
        kill $PID
    fi
    

    1.2.3 run.sh

    echo ======= stop the application =======
    source stop.sh
    echo ======= start the application =======
    source start.sh
    

    给三个文件添加执行权限:

    chmod +x start.sh stop.sh run.sh
    

    在当前目录下运行./run.sh即可启动springboot项目,且退出服务器后在本地仍可继续访问,该方法完美的解决了方法一的问题。

    2.Spring Boot 定义系统启动任务

    在 Servlet/Jsp 项目中,如果涉及到系统任务,例如在项目启动阶段要做一些数据初始化操作,这些操作有一个共同的特点,只在项目启动时进行,以后都不再执行,这里,容易想到web基础中的三大组件( Servlet、Filter、Listener )之一 Listener ,这种情况下,一般定义一个 ServletContextListener,然后就可以监听到项目启动和销毁,进而做出相应的数据初始化和销毁操作,例如下面这样:

    public class MyListener implements ServletContextListener{
    	@Override
    	public void contextInitialized(ServletContextEvent sce){
    		//数据初始化操作
    	}
    
    	@Override	
    	public void contextDestroyed(ServletContextEvent sce){
    		//数据备份操作
    	}
    }
    

    这是基础 web 项目的解决方案,如果使用了 Spring Boot,那么我们可以使用更为简便的方式。Spring Boot 中针对系统启动任务提供了两种解决方案,分别是 CommandLineRunner 和 ApplicationRunner。

    2.1 CommandLineRunner

    使用 CommandLineRunner 时,首先自定义 MyCommandLineRunner1 并且实现 CommandLineRunner 接口:

    @Component
    @Order(100)
    public class MyCommandLineRunner implements CommandLineRunner {
    	@Override
    	public void run(String... args) throw Exception{
    
    	}
    }
    
    1. 首先通过 @Compoent 注解将 MyCommandLineRunner1 注册为Spring容器中的一个 Bean。
    2. 添加 @Order注解,表示这个启动任务的执行优先级,因为在一个项目中,启动任务可能有多个,所以需要有一个排序。@Order 注解中,数字越小,优先级越大,默认情况下,优先级的值为 Integer.MAX_VALUE,表示优先级最低。
    3. 在 run 方法中,写启动任务的核心逻辑,当项目启动时,run方法会被自动执行。
    4. run 方法的参数,来自于项目的启动参数,即项目入口类中,main方法的参数会被传到这里。

    此时启动项目,run方法就会被执行,至于参数,可以通过两种方式来传递,如果是在 IDEA 中,可以通过如下方式来配置参数:

    在这里插入图片描述
    另一种方式,则是将项目打包,在命令行中启动项目,然后启动时在命令行传入参数,如下:

    java -jar devtools-0.0.1-SNAPSHOT.jar 三国演义 西游记
    

    注意,这里参数传递时没有key,直接写value即可,执行结果如下:
    在这里插入图片描述

    2.2 ApplicationRunner

    ApplicationRunner 和 CommandLineRunner 功能一致,用法也基本一致,唯一的区别主要体现在对参数的处理上,ApplicationRunner 可以接收更多类型的参数(ApplicationRunner 除了可以接收 CommandLineRunner 的参数之外,还可以接收 key/value形式的参数)。

    使用 ApplicationRunner ,自定义类实现 ApplicationRunner 接口即可,组件注册以及组件优先级的配置都和 CommandLineRunner 一致,如下:

    @Component
    @Order(98)
    public class MyApplicationRunner1 implements ApplicationRunner{
    	@Override
    	public void run (ApplicationArguments args) throws Exception{
    		List<String> nonOptionArgs = args.getNonOptionArgs();
    		System.out.println("MyApplicationRunner1>>>"+nonOptionArgs);
    		Set<String> optionNames =args.getOptionNames();
    		for(String key : optionNames) {
    			System.out.println("MyApplicationRunner1>>>"+key+":"+args.getOptionValues(key));
    		}
    		String[] sourceArgs = args.getSourceArgs();
    		System.out.println("MyApplicationRunner1>>>"+Arrays.toString(sourceArgs));
    	}
    }
    

    当项目启动时,这里的 run 方法就会被自动执行。

    1. args.getNonOptionArgs();可以用来获取命令行中的无key参数(和CommandLineRunner一样)。
    2. args.getOptionNames();可以用来获取所有key/value形式的参数的key。
    3. args.getOptionValues(key));可以根据key获取key/value 形式的参数的value。
    4. args.getSourceArgs(); 则表示获取命令行中的所有参数。

    ApplicationRunner 定义完成后,传启动参数也是两种方式,参数类型也有两种,第一种和 CommandLineRunner 一致,第二种则是 –key=value 的形式,在 IDEA 中定义方式如下:
    在这里插入图片描述
    或者使用 如下启动命令:

    java -jar devtools-0.0.1-SNAPSHOT.jar AAA BBB --age=99
    

    运行结果如下:
    在这里插入图片描述

  • 相关阅读:
    FJNU 1151 Fat Brother And Geometry(胖哥与几何)
    FJNU 1157 Fat Brother’s ruozhi magic(胖哥的弱智术)
    FJNU 1159 Fat Brother’s new way(胖哥的新姿势)
    HDU 3549 Flow Problem(最大流)
    HDU 1005 Number Sequence(数列)
    Tickets(基础DP)
    免费馅饼(基础DP)
    Super Jumping! Jumping! Jumping!(基础DP)
    Ignatius and the Princess IV(基础DP)
    Keywords Search(AC自动机)
  • 原文地址:https://www.cnblogs.com/aixing/p/13327313.html
Copyright © 2020-2023  润新知