码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2019-08-04 01:12:38      阅读:99      评论:0      收藏:0      [点我收藏+]

标签:pool   nbsp   com   执行   cep   code   lifecycle   life   ssr   

当我们设计一个程序时,依赖了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 环境下优雅关闭容器

标签:pool   nbsp   com   执行   cep   code   lifecycle   life   ssr   

原文地址:https://www.cnblogs.com/deityjian/p/11296929.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!