我有一个方法需要每天 07:00 执行。
为此,我使用该方法创建了一个 bean,并用@Scheduled(cron="0 0 7 * * ?")
。
在这个bean中我创建了一个main
function - 它将初始化 spring 上下文,获取 bean 并调用方法(至少是第一次),如下所示:
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(args[0]);
SchedulerService schedulerService = context.getBean(SchedulerService.class);
schedulerService.myMethod();
}
这工作得很好——但只有一次。
我想我明白为什么 - 因为main
线程结束 - spring 上下文也是如此,即使myMethod
注释为@Scheduled
它不会起作用。
我想了一个办法来解决这个问题 - 意思是不要让main
线程死了,也许是这样的:
while (true){
Thread.currentThread().sleep(500);
}
我认为,这就是应用程序上下文将保留的方式,我的 bean 也是如此。
我对吗?
有更好的方法来解决这个问题吗?
我正在使用 spring 3.1.2。
Thanks.
主线程应保持活动状态,直到任何非守护线程都处于活动状态。如果你有一个<task:annotation-driven/>
如果您在应用程序中添加了 .tag ,那么 Spring 应该为您启动一个带有一小部分非守护线程的执行器,并且主应用程序不应终止。
您唯一需要做的就是注册一个关闭挂钩,以确保虚拟机结束时进行清理。
context.registerShutdownHook()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)