当前位置: 首页 > 知识库问答 >
问题:

Eclipse中终止的Spring Boot应用程序-未调用关机钩子

孙永嘉
2023-03-14

我有一个Spring Boot+Spring Data Redis/KeyValue项目。我设置了一个Spring配置文件来运行嵌入所有依赖项的应用程序。因此,在启动时,我启动了一个嵌入式Redis服务器。当我在Eclipse中启动它时,一切都很好,除了我希望在停止Spring Boot应用程序时停止Redis服务器。因此,我设置了几个关机钩子,但是当我从Eclipse终止应用程序时,它们不会被调用。

他们是类似的问题,所以,我创造了这个希望有一个Redis解决方案。同样,这些类似的问题都不是Spring Boot特有的。

我尝试了很多事情:

    null
  • 关机钩子在Eclipse中不起作用
    • 如何在从Eclipse启动的进程上执行关机钩子
    • 为Eclipse RCP应用程序添加关机钩子的正确方法是什么?

    我还在Eclipse.org上看到了这篇文章,讨论了如何在从Eclipse停止应用程序时不调用关机钩子:Java应用程序的优雅关机

    以下是我所有的相关代码:

    @Component
    public class EmbeddedRedis implements ExitCodeGenerator, DisposableBean{
    
        @Value("${spring.redis.port}")
        private int redisPort;
    
        private RedisServer redisServer;
    
        @PostConstruct
        public void startRedis() throws IOException {
            redisServer = new RedisServer(redisPort);
            redisServer.stop();
            redisServer.start();
        }
    
        @PreDestroy
        public void stopRedis() {
            redisServer.stop();
        }
    
        @Override
        public int getExitCode() {
            redisServer.stop();
            return 0;
        }
    
        @Override
        public void destroy() throws Exception {
            redisServer.stop();
        }
    }
    
    spring.redis.port=6379
    
    @SpringBootApplication
    @EnableRedisRepositories
    public class Launcher {
    
        public static void main(String[] args){
            new SpringApplicationBuilder() //
            .sources(Launcher.class)//
            .run(args);
        }
    
        @Bean
        public RedisTemplate<String, Model> redisTemplate() {
            RedisTemplate<String, Model> redisTemplate = new RedisTemplate<String, Model>();
            redisTemplate.setConnectionFactory(jedisConnectionFactory());
            return redisTemplate;
        }
    
    
        @Bean
        public JedisConnectionFactory jedisConnectionFactory() {
            JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory();
            jedisConnectionFactory.setHostName("localhost");
            return jedisConnectionFactory;
        }
    }
    
    $ ps -aef | grep redis
     ... /var/folders/qg/../T/1472402658070-0/redis-server-2.8.19.app *:6379  
    
    <dependency>
        <groupId>com.github.kstyrc</groupId>
        <artifactId>embedded-redis</artifactId>
        <version>0.6</version>
    </dependency>
    

共有1个答案

黎奇思
2023-03-14

当使用SpringBoot和Eclipse时,您可以安装STS(Spring Tool Suite)Eclipse插件来实现优雅的关机。

安装后,将应用程序作为“Spring Boot App”而不是常规的“Java应用程序”运行(运行/调试配置)

确保选中复选框“启用生命周期管理”复选框,当您单击红色方块按钮停止应用程序时,它将执行优雅的关机而不是硬杀死。

 类似资料:
  • 我正在尝试学习Android中的本机应用程序开发,为此我创建了一个示例应用程序,现在我正在尝试调试它。我按照此页面上的教程进行调试。但是现在当我开始使用此配置进行调试时,我得到以下错误: 我的开发环境(如果需要): 任何帮助赞赏。

  • 我正在尝试使用WorkManager每10秒运行一个简单的工作。当应用程序在后台或前台运行时,它可以完美地工作。当我关闭应用程序(杀死应用程序)时,工作将不再被调用。 我在创建MainActivity时调用以下代码 工人阶级 这些代码在我的应用程序未关闭时运行良好。 我如何让它运行,即使应用程序关闭?

  • 问题内容: 我需要在Java Web应用程序停止或tomcat停止时保存一些数据。如何才能做到这一点?编辑:如果我使用jvm shutdown钩有什么缺点? 问题答案: 使用在您的web.xml 中实现ServletContextListener的类:

  • onMessageReceived(RemoteMessage RemoteMessage)在应用程序处于后台时未调用或仅显示{“body”:“test”,“title”:“test notification}之类的json字符串

  • 什么在起作用 我已经使用以下Xamarin指南为我们的Xamarin表单应用程序的Android端实现了推送通知: https://developer.xamarin.com/guides/android/application_funcaments/notifications/remote-notifications-with-gcm/ 这非常有效,我们正确地在应用程序运行时和后台调用OnNew

  • 试图在docker中运行的简单Spring Boot应用程序,但在docker运行后,会立即退出。这是我的文件 Docker运行命令 在容器日志中,唯一的输出是Spring横幅,然后容器终止。 我错过了什么吗?