0

我创建了一个迷你框架来从方法执行一些 spring bean,main()而不是部署和运行成熟的 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 应用程序上下文有关。也许一些特殊的弹簧相关的非守护线程启动了?如果是这样,有什么方法可以杀死它?或者在如此简单的代码中可能还有什么其他原因?

4

1 回答 1

3

对于独立应用程序(不在任何容器中运行),需要注册shutdownhook,以便在应用程序退出时干净关闭spring容器。

于 2012-10-24T08:13:00.430 回答