首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在异常情况下不调用Spring (ContextClosedEvent事件)

在异常情况下不调用Spring (ContextClosedEvent事件)
EN

Stack Overflow用户
提问于 2022-03-04 15:58:53
回答 1查看 243关注 0票数 0

下面是示例代码,即

代码语言:javascript
复制
@Override
    public void run(ApplicationArguments applicationArguments) throws Exception {
        log.info("Starting...");
        mainThread.start();
        mainThread.join();
        log.info("Exiting...");
    }

    @EventListener
    public void onApplicationEvent(ContextClosedEvent event) {
        log.info("Inside on ApplicationEvent");
        mainThread.interrupt();
        log.info("Thread Interupted");
    }

    @Override
    public void run() {
        try {
            someAppLogic.doLogic();
        } catch (Exception e) {
            if (e instanceof  InterruptedException || e.getCause() instanceof InterruptedException) {
                log.info("Interrupted...");
            } else {
                log.error("Exception occurred", e);
                exitCode = 1;
            }
        }
    }

  1. someAppLogic.doLogic();在someAppLogic.doLogic
  2. 上被调用--目标是在someAppLogic.doLogic()出现异常的情况下在ApplicationEvent上的方法中有mainThread中断;并且有一个exitcode作为1.

但是问题是,在运行方法出现异常时,main.interrupt()在onApplicationEvent中永远不会获得调用,也就是说,当someAppLogic.doLogic()抛出异常时。

这个Spring引导应用程序将部署在Kubernetes中,因此包含此功能的pod应该会优雅地关闭。

因此,问题是如何处理由someAppLogic.doLogic()引发的任何异常;优雅地将exitcode发送为1?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-04 17:24:17

您需要调用ConfigurableApplicationContext上的close()来发布ContextClosedEvent。

代码语言:javascript
复制
    //you need to figure out how to get hold of this object
    private ConfigurableApplicationContext context;
    
    @Override
    public void run() {
        try {
            someAppLogic.doLogic();
        } catch (Exception e) {
            if (e instanceof  InterruptedException || e.getCause() instanceof InterruptedException) {
                log.info("Interrupted...");
            } else {
                log.error("Exception occurred", e);
                exitCode = 1;
                //call close
                context.close();
            }
        }
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71353986

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档