我写了以下内容,但它会立即退出:
public static void main(String[] args) {
new ClassPathXmlApplicationContext("/springtests/test01.xml");
}
test01.xml
包含多个bean,其中包含一些连接到网络的线程(守护程序)等。
如何等待或什么?
答案 0 :(得分:4)
你要做的就是在这里创建一个对象。您需要检索bean然后使用它们。例如
ApplicationContext ctx = new ClassPathXmlApplicationContext("/springtests/test01.xml");
MyClass myObj= MyClass.class.cast(ctx.getBean("myBeanName"));
myObj.doStuff();
如果您需要更多帮助,请发布test01.xml中的内容
答案 1 :(得分:1)
虽然我同意其他答案中的大多数建议,但我认为你的主要方法是可行的。您需要更改的唯一事情是使至少一个工作线程非守护进程。
来自Thread.setDaemon Java doc:
当运行的唯一线程都是守护程序线程时,Java虚拟机退出。
还要确保在bean的init方法(或afterPropertiesSet)期间启动所有线程,并且不需要启动bean(实现生命周期接口)。您对所有bean进行编码的方式将被初始化但不会启动。
答案 2 :(得分:1)
如何等待或什么?
我使用了类似下面的模式。我的Main
线程启动上下文,然后等待其他人调用Main.shutdownLatch.countDown()
命令告诉它关闭上下文并退出。我通常使用JMX命令执行此操作。
public static CountDownLatch shutdownLatch = new CountDownLatch(1);
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("/springtests/test01.xml");
try {
shutdownLatch.await();
} finally {
context.close();
}
}
答案 3 :(得分:0)
您可以调用context.registerShutdownHook()
以确保that the beans in the applicationContext are shut down properly,但是如果applicationContext仅启动守护程序线程,您仍需要确保主线程不会退出。
更好的策略是main()
从它可以调用bean.startApp()
的上下文中检索一些bean,启动它 - 或者至少有一个线程在上下文中启动非守护。
答案 4 :(得分:0)
你可以让你的bean实现ApplicationListener<ContextStartedEvent>
,即:
@Override
public final void onApplicationEvent(ContextStartedEvent event) {...
也许还有ExitCodeGenerator
:
@Override
public int getExitCode() {
然后您的主要方法可能是:
public static void main(String[] args) {
try (ConfigurableApplicationContext context = SpringApplication.run(AppConfig.class, args)) {
context.start();
System.exit(SpringApplication.exit(context));
}
}
答案 5 :(得分:0)
初始化spring上下文后,在单独的线程中执行逻辑。当新线程启动时可以等待一个条件,主线程将在你的逻辑仍在另一个线程中运行时完成。可以通过JMX更新变量值来停止该线程。
ApplicationContext ctx = new ClassPathXmlApplicationContext("/springtests/test01.xml");
MyClass myObj= MyClass.class.cast(ctx.getBean("myBeanName"));
ExecutorService executor= Executors.newSingleThreadExecutor();
executor.submit(new Runnable() {
@Override
public void run() {
//Update the value of this variable via jmx
while(<SomeAtomicBooleanValueCheck>)
{
myObj.doStuff();
}
}
})