不使用devtools,尝试其他重启方法

为什么不用devtools:

spring-boot-devtools不可应用至生产环境:
https://blog.csdn.net/qq_53985858/article/details/135064490

通过创建新上下文重新启动:

可以通过关闭应用程序上下文并从头创建一个新上下文来重新启动应用程序。

@SpringBootApplication
public class Application {

    private static ConfigurableApplicationContext context;

    public static void main(String[] args) {
        context = SpringApplication.run(Application.class, args);
    }

    public static void restart() {
        ApplicationArguments args = context.getBean(ApplicationArguments.class);

        Thread thread = new Thread(() -> {
            context.close();
            context = SpringApplication.run(Application.class, args.getSourceArgs());
        });

        thread.setDaemon(false);
        thread.start();
    }
}

在一个单独的非守护线程中重新创建上下文是很重要的—这样我们可以防止由close方法触发的JVM关闭关闭我们的应用程序。否则,我们的应用程序将停止,因为JVM不会在终止守护进程线程之前等待它们完成。

另外,让添加一个REST接口,通过它可以触发重启:

@RestController
public class RestartController {
    
    @PostMapping("/restart")
    public void restart() {
        Application.restart();
    } 
}

此方法遇到的问题:
只能重启一次,第二次重启时报错,想要再次重启的时候就报静态存的Context为Null

方法二:使用Spring Boot Actuator的内置RestartEndpoint

首先,添加所需的Maven依赖项:

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

将RestartEndpoint注入我们的服务

@Service
public class RestartService {
    
    @Autowired
    private RestartEndpoint restartEndpoint;
    
    public void restartApp() {
        restartEndpoint.restart();
    }
}

创建controller测试

在这里插入图片描述
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值