为什么不用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测试