• 重启springboot


    前言:springboot项目开发时,会遇到项目重新启动的情况。在百度上资料比较零碎需要整理,实践时需要踩坑,自己在项目中已经实现的功能拿出来与大家分享。希望每一位coder能在编程的路上少走一些弯路。

    重启springboot

    1. 开发环境(development)

    • 在application.properties文件中加入如下的配置信息,为动态修改配置信息提供数据:
    spring.application.name= SPRING-BOOT-APPLICATION
    
    • 在springboot主类中定义两个私有变量,用于存放main()方法的参数和SpringApplication.run()方法返回的值:
    public class SpringbootwebApplication {
        @Value( "${spring.application.name}" )
        String appName;
        private static String[] args;
        private static ConfigurableApplicationContext context;
    
        public static void main(String[] args) {
            SpringbootwebApplication.args = args;
            SpringbootwebApplication.context = SpringApplication.run(SpringbootwebApplication.class, args);
        }
    }
    
    • RESTful API
    @GetMapping("/api/refresh")
    public Object restart(){
        try {
            ExecutorService threadPool = new ThreadPoolExecutor(1,1,0, TimeUnit.SECONDS,new ArrayBlockingQueue<>( 1 ),new ThreadPoolExecutor.DiscardOldestPolicy ());
            threadPool.execute (()->{
                context.close();
                context = SpringApplication.run(SpringbootwebApplication.class,args);
                } );
                threadPool.shutdown();
                return ResultBody.success("重启网站成功");
            } catch (Exception e) {
                throw new Exception(CommonEnum.INTERNAL_SERVER_ERROR);
            }
    }
    

    2. 生产环境(production)

    项目打成jar包完成部署以后,生产环境重启失效项目缓存并未清理未达到预计效果,此时需要用脚本重启。

    • idea>settings>plugins search BashSupport

    • create bash file

    • bash linux restart. use: sh restart.sh restart
    #!/bin/bash
    #脚本与jar包放在同一目录下
    #可替换为你自己的执行程序,其他代码无需更改
    APP_NAME=springbootweb-0.0.1-SNAPSHOT.jar
    #使用说明,用来提示输入参数
    usage() {
        echo "Usage: sh restart.sh [start|stop|restart|status]"
        exit 1
    }
    
    #检查程序是否在运行
    is_exist(){
      pid=`ps -ef|grep $APP_NAME|grep -v grep|awk '{print $2}' `
      #如果不存在返回1,存在返回0
      if [ -z "${pid}" ]; then
       return 1
      else
        return 0
      fi
    }
    
    #启动方法
    start(){
      is_exist
      if [ $? -eq "0" ]; then
        echo "${APP_NAME} is already running. pid=${pid} ."
      else
        nohup java -jar $APP_NAME > nohup.out 2>&1 &
        echo "${APP_NAME} running successfully";
      fi
    }
    
    #停止方法
    stop(){
      is_exist
      if [ $? -eq "0" ]; then
        kill -9 $pid
        echo "${APP_NAME} Closing successfully"
      else
        echo "${APP_NAME} is not running"
      fi
    }
    
    #输出运行状态
    status(){
      is_exist
      if [ $? -eq "0" ]; then
        echo "${APP_NAME} is running. Pid is ${pid}"
      else
        echo "${APP_NAME} is NOT running."
      fi
    }
    
    #重启
    restart(){
      stop
      start
    }
    
    #根据输入参数,选择执行对应方法,不输入则执行使用说明
    case "$1" in
      "start")
        start
        ;;
      "stop")
        stop
        ;;
      "status")
        status
        ;;
      "restart")
        restart
        ;;
      *)
        usage
        ;;
    esac
    

    到了这一步其实还未结束,当你在网上一步步走到这里的时候以为linux敲个命令 sh restart.sh start 就万事大吉了。
    其实这个时候bash很可能还不能用,因为开发环境是windows的bash,此时使用会异常。
    解决方案:
    使用dos2unix命令,转译bash > dos2unix restart.sh(需要安装插件)
    1.下载插件
       Dos2Unix
    2.上传taz。此时是压缩包格式用命令解压安装

    tar -zxvf hd2u-1.0.0.tgz
    cd hd2u-1.0.0.tgz
    ./configure && make && make install
    

    3.此时如果安装不上dos2unix。此时需要另外一个插件popt
       Popt-1.18

    tar -zxvf popt-1.18.tar.gz
    cd popt-1.18
    ./configure && make && make install
    

    4.验证一下Dos2Unix安装成功与否。

    dos2unix -v
    

    5.大功告成 转译。然后就可以愉快的使用bash了

    dos2unix restart.sh
    
  • 相关阅读:
    不懂数据库索引的底层原理?那是因为你心里没点b树
    你必须了解的java内存管理机制(三)-垃圾标记
    一次给女朋友转账引发我对分布式事务的思考
    看完此文,妈妈还会担心你docker入不了门?
    再过半小时,你就能明白kafka的工作原理了
    IEEE 754浮点数表示标准
    ROM正弦波发生器
    对分布式工程的初步认识和理解
    泛型(二)
    泛型(一)
  • 原文地址:https://www.cnblogs.com/wufanJY/p/13754743.html
Copyright © 2020-2023  润新知