Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从Shell脚本正常关闭Spring启动应用程序_Java_Spring_Shell_Spring Boot - Fatal编程技术网

Java 从Shell脚本正常关闭Spring启动应用程序

Java 从Shell脚本正常关闭Spring启动应用程序,java,spring,shell,spring-boot,Java,Spring,Shell,Spring Boot,我有一个spring引导应用程序,我使用一个可执行的jar文件运行它。目前,为了停止服务,我们正在终止进程。我看到我们可以使用以下方法优雅地关闭应用程序 ApplicationContext ctx = SpringApplication.run(Application.class, args); 然后在代码中的某个地方我可以调用ctx.close(),或者我们可以使用下面的静态方法 SpringApplication.exit(ApplicationContext, ExitCodeGene

我有一个spring引导应用程序,我使用一个可执行的jar文件运行它。目前,为了停止服务,我们正在终止进程。我看到我们可以使用以下方法优雅地关闭应用程序

ApplicationContext ctx = SpringApplication.run(Application.class, args);
然后在代码中的某个地方我可以调用
ctx.close()
,或者我们可以使用下面的静态方法

SpringApplication.exit(ApplicationContext, ExitCodeGenerator)
它目前对我们有效,但我们实际上在控制器中调用了这个
ctx.close()
方法,如下所示

@RequestMapping("/shutdownSpringBoot")
public void shutdownApplication() {
    MyApplication.ctx.close(); // I'm saving the context returned by spring boot in a static variable inside my main class
}
当我们通过http点击此控制器方法时,应用程序将正常关闭。但我们不想这样做。是否可以编写一个shell/batch脚本来触发java类,我可以在其中调用
ctx.close()
方法?我们正在寻找一个类似于从独立tomcat容器(shutdown.bat/shutdown.sh)获得的关闭脚本,这样我们就可以将应用程序作为jar文件提供给客户,客户可以通过执行这些脚本来启动或停止应用程序。(他们已经习惯了)

谢谢,
Sanjay

我认为您可以通过检查命令行参数,而不是加载整个Spring上下文并启动web应用程序,简单地检测到您正在将jar作为命令行实用程序运行,您只需使用内置Java HTTP客户端HTTP访问本地
ShutdowsSpringBoot
URL。

您可以创建一个shell脚本并直接关闭springboot应用程序。只需确保将shutdownhook注册到spring引导应用程序。在shutdownhook中,可以关闭上下文。您可以检查我的答案

我使用PID file writer编写文件,并将Jar和PID存储在与应用程序名同名的文件夹中,shell脚本也与最后的start和stop同名

主类

@SpringBootApplication
public class MyApplication {

    public static final void main(String[] args) {
        SpringApplicationBuilder app = new SpringApplicationBuilder(MyApplication.class);
        app.build().addListeners(new ApplicationPidFileWriter());
        app.run();
    }
}
YML文件

spring.pid.fail-on-write-error: true
spring.pid.file: /server-path-with-folder-as-app-name-for-ID/appName/appName.pid
以下是启动脚本(start appname.sh):

发送SIGINT是一种优雅的方式,可以启动您上面描述的内容。停止脚本可以是一行程序,读取application.pid并将其传递给kill。
shellScriptFileName=$(basename -- "$0")
shellScriptFileNameWithoutExt="${shellScriptFileName%.*}"
appName=${shellScriptFileNameWithoutExt:6}

PROCESS=$1
PIDS=`ps aux |grep [j]ava.*$appName.*jar | awk {'print $2'}`
if [ -z "$PIDS" ]; then
  echo "No instances of $appName is running..." 1>&2
else
  for PID in $PIDS; do
    echo "Waiting for the process($PID) to finish on it's own for 3 mins..."
    sleep 3m
    echo "FATAL:Killing $appName with PID:$PID."
    kill -9 $PID
  done
fi

# Preparing the java home path for execution
JAVA_EXEC='/usr/bin/java'

# Java Executable - Jar Path Obtained from latest file in directory
JAVA_APP=$(ls -t /server-path-with-folder-as-app-name/$appName/$appName*.jar | head -n1)

# JVM Parameters and Spring boot initialization parameters
JVM_PARAM="-Xms512m -Xmx1024m -Dspring.profiles.active=sit -Dcom.webmethods.jms.clientIDSharing=true"

# To execute the application.
FINAL_EXEC="$JAVA_EXEC $JVM_PARAM -jar $JAVA_APP"

# Making executable command using tilde symbol and running completely detached from terminal
`nohup $FINAL_EXEC  </dev/null >/dev/null 2>&1 &`

echo "$appName has been started successfully."
shellScriptFileName=$(basename -- "$0")
shellScriptFileNameWithoutExt="${shellScriptFileName%.*}"
appName=${shellScriptFileNameWithoutExt:5}

# Script to stop the application
PID_PATH="server-path-with-folder-as-app-name-for-PID/$appName/$appName.pid"

if [ ! -f "$PID_PATH" ]; then
   echo "Process Id FilePath($PID_PATH) Not found"
else
pid=`cat $PID_PATH`
    if [ ! -e /proc/$pid -a /proc/$pid/exe ]; then
        echo "$appName was not running.";
    else
       kill $pid;
       echo "Gracefully stopping $appName with PID:$pid..."
    fi
fi