Spring-IOC 在非 web 环境下优雅关闭容器

Posted deityjian

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring-IOC 在非 web 环境下优雅关闭容器相关的知识,希望对你有一定的参考价值。

当我们设计一个程序时,依赖了Spring容器,然而并不需要spring的web环境时(Spring web环境已经提供了优雅关闭),即程序启动只需要启动Spring ApplicationContext即可,那我们如何去进行优雅关闭呢?

 设计一个代理程序,仅需要Spring容器管理部分bean并启动即可。该工程最终打成一个可执行Jar包,并构建成docker镜像后进行启动

public class Main 
    public static void main(String[] args) throws InterruptedException 
        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath*:services.xml");
        applicationContext.start();
    

有一个bean开启线程执行业务任务

@Component
public class HelloLifeCycle implements Lifecycle 
    private volatile boolean running = false;
    private volatile boolean businessRunning = true;


    private ExecutorService executors = Executors.newFixedThreadPool(1);

    public HelloLifeCycle() 
        executors.execute(() -> 
            while (businessRunning) 
               //启动后,做业务需要做的事情
            
        );
    


    public void start() 
        logger.info("lifycycle start");
        running = true;

    

    public void stop() 
        businessRunning=false;
        logger.info("lifycycle stop ,and stop the execute");
        executors.shutdown();
        try 
            executors.awaitTermination(1, TimeUnit.HOURS);
         catch (InterruptedException e) 
        
        running = false;
    

    public boolean isRunning() 
        return running;
    

该业务类实现了Spring的LifeCycle钩子,Spring在调用其context的start()和stop()方法时会回调业务类实现的start和stop方法

优雅关闭

如果就像上面的Main启动类,我们直接kill这个进程时,Spring是不会优雅关闭的,从而不会调用stop方法

public class Main 
    public static void main(String[] args) throws InterruptedException 
        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath*:services.xml");
        applicationContext.registerShutdownHook();
        applicationContext.start();
    

 

以上是关于Spring-IOC 在非 web 环境下优雅关闭容器的主要内容,如果未能解决你的问题,请参考以下文章

优雅关闭web服务的方式

从 Web API 方法返回的错误消息在非开发环境中被省略

stop tomcat web application 优雅地关闭所有 servlet 连接

积累如何优雅关闭SpringBoot Web服务进程

积累如何优雅关闭SpringBoot Web服务进程

在 .NET 环境中优雅地缩小动态生成的 javascript? [关闭]