使用Spring上下文的命令行应用程序永远不会结束

时间:2012-10-24 07:51:29

标签: java spring main hang

我创建了迷你框架来执行main()方法中的一些spring bean,而不是部署和运行完整的webapp来启动这些bean。它看起来像这样:

public abstract class BaseLauncher {

    private static final String APP_CONTEXT_PATH = "com/project/dev/launchers/launchersApplicationContext.xml";
    static ApplicationContext context = new ClassPathXmlApplicationContext(APP_CONTEXT_PATH);

    protected void launch() {
        context.getBean(getClass()).perform();
        //The process never ends so we want to know when we can kill it
        System.out.println("launcher finished");
    }

    @Transactional
    abstract protected void perform();

}

示例启动器看起来像这样:

@Component
public class ParamLoaderLauncher extends BaseLauncher {
    @Inject
    ParamLoader paramLoader;

    public static void main(String[] args) {
        new ParamLoaderLauncher().launch();
    }

    @Override
    protected void perform() {
        paramLoader.loadParams();
    }
}

除了当调用的bean方法完成时,应用程序只是继续运行,我们需要手动终止它,这一切都很有效。我想这与使用spring app context有关。也许推出一些特殊的弹簧相关的非deamon线程?如果是这样,有没有办法杀死它?或者其他原因可能是这么简单的代码?

1 个答案:

答案 0 :(得分:3)

对于独立应用程序(不在任何容器中运行),shutdownhook needs to be registered用于在应用程序退出时清理关闭弹簧容器。