在弹簧的独立应用程序调度方法(Scheduled method in a standalone ap

2019-09-21 21:01发布

我有一个需要被每天07:00执行的方法。 对于这个问题,我创建一个豆与方法,并用它注解@Scheduled(cron="0 0 7 * * ?") 在这个bean我装箱一个main功能-这将初始化Spring上下文,拿到豆和调用方法(至少在第一次),如下所示:

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);
}

这就是我,想,应用程序上下文将保留,所以是我的豆。

我对吗?

有没有更好的办法来解决这个问题?

我使用的弹簧3.1.2。

谢谢。

Answer 1:

直到所有非守护线程是活着的主线程应该保持活跃。 如果你有一个<task:annotation-driven/>标签在你的应用程序那么Spring应该启动了非守护线程,为您和主要应用程序不应终止的小型游泳池的执行者。

你需要做的唯一一件事就是注册也关闭钩子,以确保清理VM时结束。

context.registerShutdownHook()



Answer 2:

join方法是非常理想的:

    try {
        Thread.currentThread().join();
    } catch (InterruptedException e) {
        logger.warn("Interrupted", e);
    }

另外,这里的老同学wait方法:

    final Object sync = new Object();
    synchronized (sync) {
        try {
            sync.wait();
        } catch (InterruptedException e) {
            logger.warn("Interrupted", e);
        }
    }


文章来源: Scheduled method in a standalone application in spring