Java Spring应用程序最简单的main()方法是什么?
我写了以下内容,但它立即退出:Java Spring应用程序最简单的main()方法是什么?,java,spring,main,Java,Spring,Main,我写了以下内容,但它立即退出: public static void main(String[] args) { new ClassPathXmlApplicationContext("/springtests/test01.xml"); } test01.xml包含多个bean,其中包含一些连接到网络等的线程(守护进程) 如何等待或做些什么?您所做的就是在这里创建一个对象。您需要检索bean,然后使用它们。比如说 ApplicationContext ctx = new ClassP
public static void main(String[] args) {
new ClassPathXmlApplicationContext("/springtests/test01.xml");
}
test01.xml
包含多个bean,其中包含一些连接到网络等的线程(守护进程)
如何等待或做些什么?您所做的就是在这里创建一个对象。您需要检索bean,然后使用它们。比如说
ApplicationContext ctx = new ClassPathXmlApplicationContext("/springtests/test01.xml");
MyClass myObj= MyClass.class.cast(ctx.getBean("myBeanName"));
myObj.doStuff();
如果需要更多帮助,请发布test01.xml中的内容,您可以调用
context.registerShutdownHook()
来确保,但如果applicationContext仅启动守护程序线程,则仍然需要确保主线程不会退出
一个更好的策略是
main()
从上下文中检索一些bean,它可以调用bean.startApp()
,启动一些东西,或者至少让上下文中启动的一个线程是非守护进程。尽管我同意其他答案中的大多数建议,我认为你的主要方法是好的,因为它是。唯一需要更改的是使至少一个工作线程成为非守护进程
从Thread.setDaemon Java文档:
当运行的线程都是守护进程线程时,Java虚拟机将退出
还要确保所有线程都是在bean的init方法(或afterPropertiesSet)期间启动的,并且不需要启动bean(实现生命周期接口)。按照您的编码方式,所有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
,即:
@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));
}
}
初始化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();
}
}
})
ApplicationContext ctx=new ClassPathXmlApplicationContext(“/springtests/test01.xml”);
MyClass myObj=MyClass.class.cast(ctx.getBean(“myBeanName”);
ExecutorService executor=Executors.newSingleThreadExecutor();
执行者提交(新的可运行(){
@凌驾
公开募捐{
//通过jmx更新此变量的值
while()
{
myObj.doStuff();
}
}
})
有人想解释-1吗?