Springboot 中 想要重启服务 该怎么写?

2022-11-14 15:20:09 +08:00
 gzk329

网上找到的方法

@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();
    }
}

还有是 restartEndpoint.restart();

重启结果显示无法初始化与 Mybatis-plus 相关的 bean ?

3741 次点击
所在节点    程序员
26 条回复
wupher
2022-11-15 09:33:03 +08:00
wxw752
2022-11-15 09:49:43 +08:00
我这用的也是三楼说的方案 => "System.exit() 然后等 supervisor 把自己拉起来"
wineast
2022-11-15 10:02:56 +08:00
@gzk329 是不是你启动的脚本命令不对?比如 java -jar xxx.jar 的问题,是不是没加载其他必须的 classpath ,导致没有加载到对应的第三方库
gzk329
2022-11-15 10:10:26 +08:00
@wineast 脚本启动 没问题的 能重启 但是会产生多个进程 明明端口是一样的 最多只会启动一个服务 但是会产生多个进程 脚本是有这个问题 但是功能没问题
之前说的显示无法加载与 Mybatis-plus 相关的 bean 是通过 重新生成 spring 上下文的方式重启的,也就是这个 context.close();
context = SpringApplication.run(Application.class, args.getSourceArgs());
mxinyi1212
2022-11-15 10:33:45 +08:00
之前这么用过

public void restart(){
ExecutorService threadPool = new ThreadPoolExecutor(1,1,0, TimeUnit.SECONDS,new ArrayBlockingQueue<>( 1 ),new ThreadPoolExecutor.DiscardOldestPolicy ());
threadPool.execute (()->{
context.close ();
//do xxxx
}
context = SpringApplication.run ( Application.class,args );
} );
threadPool.shutdown ();

}
fkname
2022-11-15 15:24:18 +08:00
用另一个进程或脚本监控一下,没必要搞复杂了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/895138

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX