我寫了下面,但立即退出:什麼是Spring應用程序的最簡單的main()方法?
public static void main(String[] args) {
new ClassPathXmlApplicationContext("/springtests/test01.xml");
}
test01.xml
包含多個豆某些線程(守護進程),它連接到網絡等
如何等待什麼?
我寫了下面,但立即退出:什麼是Spring應用程序的最簡單的main()方法?
public static void main(String[] args) {
new ClassPathXmlApplicationContext("/springtests/test01.xml");
}
test01.xml
包含多個豆某些線程(守護進程),它連接到網絡等
如何等待什麼?
你所做的只是在這裏創建一個對象。您需要檢索這些bean然後使用它們。例如
ApplicationContext ctx = new ClassPathXmlApplicationContext("/springtests/test01.xml");
MyClass myObj= MyClass.class.cast(ctx.getBean("myBeanName"));
myObj.doStuff();
如果你想那麼更多的幫助張貼什麼是你test01.xml
您可以撥打context.registerShutdownHook()
確保that the beans in the applicationContext are shut down properly,但你仍然需要確保主線程不會退出,如果applicationContext只啓動守護進程線程。
更好的策略是:main()
從上下文中檢索一些bean,它可以調用bean.startApp()
,或者至少有一個在上下文中啓動的線程是非守護進程。
雖然我同意其他答案中的大部分建議,但我認爲你的主要方法是可以的。你唯一需要改變的是至少讓你的一個工作線程不守護進程。
從Thread.setDaemon Java文檔:
Java虛擬機退出時正在運行的線程都是守護線程。
還要確保您的所有線程都是在bean的init方法(或afterPropertiesSet)期間啓動的,並且不需要啓動bean(實現生命週期接口)。你有它的方式編碼所有的豆將被初始化,但沒有開始。
如何等待或什麼?
我已經使用了類似下面的模式。我的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();
}
}
你可以有你的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));
}
}
在初始化彈簧上下文後,請在單獨的線程中執行邏輯。當新的線程啓動,可以等待一個條件,主線程將完成,而你的邏輯仍然在另一個線程中運行。該線程可以通過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();
}
}
})
任何人都想解釋-1? – Gray