我想与spring-mvc web应用程序并行运行后台进程。我需要一种方法来自动启动上下文加载。后台进程是一个实现Runnable
的类。
spring-mvc有一些设施吗?
答案 0 :(得分:16)
Spring有一个全面的任务执行框架。请参阅relevant part of the docs。
我建议在您的上下文中使用Spring bean,在初始化时,将后台Runnable
提交给SimpleAsyncTaskExecutor
bean。这是最简单的方法,你可以根据自己的需要使其变得更加复杂和有能力。
答案 1 :(得分:7)
我会继续看看由skaffman链接的任务调度文档,但是如果您真正想要做的就是在上下文初始化时启动后台线程,那么还有一种更简单的方法。
<bean id="myRunnableThingy">
...
</bean>
<bean id="thingyThread" class="java.lang.Thread" init-method="start">
<constructor-arg ref="myRunnableThingy"/>
</bean>
答案 2 :(得分:3)
作为另一种选择,现在可以使用Spring的调度功能。对于Spring 3或更高版本,它具有类似注释的cron,允许您使用方法的简单注释来安排要运行的任务。自动装配也很友好。
此示例每隔2分钟安排一次任务,初始等待(启动时)为30秒。方法完成后,下一个任务将运行2分钟!如果您希望它每2分钟运行一次,请改用fixedInterval。
@Service
public class Cron {
private static Logger log = LoggerFactory.getLogger(Cron.class);
@Autowired
private PageService pageService;
@Scheduled(initialDelay = 30000, fixedDelay=120000) // 2 minutes
public void cacheRefresh() {
log.info("Running cache invalidation task");
try {
pageService.evict();
} catch (Exception e) {
log.error("cacheRefresh failed: " + e.getMessage());
}
}
}
请务必添加@EnableAsync @EnableScheduling到您的Application类以启用此功能。