Spring/SpringBoot系列之SpringBoot停止服务的3种方式【二十一】

1. springboot提供的actuator的功能

第一种就是springboot提供的actuator的功能,它可以执行shutdown, health, info等,默认情况下,actuator的shutdown是disable的,我们需要打开它。首先引入acturator的maven依赖:

<dependency>
	<groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

然后配置application.yml:

management:
  endpoint:
    shutdown:
      enabled: on

创建一个测试bean:

package com.linyf.demo.terminate;

import javax.annotation.PreDestroy;

public class TerminateBean {
    @PreDestroy
    public void perDestroy(){
        System.out.println("TerminalBean is destroyed");
    }
}

配置类:

package com.linyf.demo.terminate;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ShutDownConfig {
    @Bean
    public TerminateBean getTerminateBean(){
        return new TerminateBean();
    }
}

在启动类中加入启动日志:

package com.linyf.demo;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;


@SpringBootApplication
@EnableCaching
public class DemoApplication {
    private static final Logger log = LoggerFactory.getLogger(DemoApplication.class);
    public static void main(String[] args) {
        log.info("curl -X POST http://localhost:8088/actuator/shutdown");
        SpringApplication.run(DemoApplication.class, args);
    }
}

启动项目,可以看到输出日志:
Spring/SpringBoot系列之SpringBoot停止服务的3种方式【二十一】_第1张图片
关闭项目,可以看到输出日志:
在这里插入图片描述

2. SpringBoot应用上下文

获取程序启动时候的context,然后关闭主程序启动时的context。这样程序在关闭的时候也会调用PreDestroy注解标记的方法。如下方法,程序启动十秒后自动进行关闭:

package com.linyf.demo;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.ConfigurableApplicationContext;

import java.util.concurrent.TimeUnit;


@SpringBootApplication
@EnableCaching
public class DemoApplication {
    private static final Logger log = LoggerFactory.getLogger(DemoApplication.class);
    public static void main(String[] args) {
        log.info("curl -X POST http://localhost:8088/actuator/shutdown");
        ConfigurableApplicationContext run = SpringApplication.run(DemoApplication.class, args);

        try{
            TimeUnit.SECONDS.sleep(10);
        }catch (Exception e){
            e.printStackTrace();
        }

        run.close();
    }
}

3. 记录程序启动的进程号

在springboot启动的时候将进程号写入一个app.pid文件,生成的路径是可以指定的。这种方法使用的比较普遍。写一个start.sh用于启动springboot程序,然后写一个停止程序将服务停止。

package com.linyf.demo;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.ApplicationPidFileWriter;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.ConfigurableApplicationContext;

import java.util.concurrent.TimeUnit;


@SpringBootApplication
@EnableCaching
public class DemoApplication {
    private static final Logger log = LoggerFactory.getLogger(DemoApplication.class);
    public static void main(String[] args) {
//        log.info("curl -X POST http://localhost:8088/actuator/shutdown");
//        ConfigurableApplicationContext run = SpringApplication.run(DemoApplication.class, args);
//
//        try{
//            TimeUnit.SECONDS.sleep(10);
//        }catch (Exception e){
//            e.printStackTrace();
//        }
//
//        run.close();
        SpringApplication application = new SpringApplication(DemoApplication.class);
        application.addListeners(new ApplicationPidFileWriter("C:\\Users\\fei62\\app.pid"));
        application.run();
    }
}

然后就会生成一个文件:
在这里插入图片描述
里面就是进程号。

你可能感兴趣的:(java)