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