我有一个使用H2数据库为实体处理CRUD操作的服务。以前在测试阶段,我使用一个csv文件作为数据库,在应用程序关闭时,我将所有内存中对实体的更改保存到这个csv文件中。现在我想做同样的事情。但是由于某种原因,我在onExit()
方法中没有遇到任何断点,因此在应用程序关闭时没有保存数据。要保存哪些 * 实体,但现在我只希望在Intellij中按下停止'应用程序'按钮时能够自动保存
@Component
public class MangaDataProvider {
private static MangaService mangaService;
@Autowired
public MangaDataProvider(MangaService mangaService) {
MangaDataProvider.mangaService = mangaService;
}
@PreDestroy
public static void onExit() {
mangaService.saveAll();
}
}
在Application
中有一个onExit()
方法:
@SpringBootApplication
public class Application extends SpringBootServletInitializer implements AppShellConfigurator {
public static void main(String[] args) {
LaunchUtil.launchBrowserInDevelopmentMode(SpringApplication.run(Application.class, args));
}
@PreDestroy
public void onExit() {
MangaDataProvider.onExit();
}
}
1条答案
按热度按时间eit6fx6z1#
无法保证shutdown hook一定会被执行。它们的执行时间非常有限。这意味着您的代码可能会被部分执行。您可以尝试添加一条Print语句,或者一个调试断点。您会看到第一条语句执行了,因为它非常快,但是没有时间执行方法的其余部分。
一个好的做法是调用一个服务或一个终结点来“准备”(在你的情况下,它将保存你的数据)你的应用程序关闭。你调用这个服务/终结点,然后,当执行完成时,你可以安全地终止应用程序。
许多服务器应用程序都有一个“准备关机”端点。)