开发者

How to create background process in spring webapp?

开发者 https://www.devze.com 2022-12-14 08:11 出处:网络
I want to run background process in parallel with my spring-mvc web-application. I need a way to start in automatically on context loading. Backgroun开发者_高级运维d process is a class that implements

I want to run background process in parallel with my spring-mvc web-application. I need a way to start in automatically on context loading. Backgroun开发者_高级运维d process is a class that implements Runnable. Is spring-mvc has some facilities for that?


Spring has a comprehensive task execution framework. See the relevant part of the docs.

I suggest having a Spring bean in your context, which, when initialized, submits your background Runnable to a SimpleAsyncTaskExecutor bean. That's the simplest approach, which you can make more complex and capable as you see fit.


I would go ahead and look at the task scheduling documentation linked by skaffman, but there's also a simpler way if all you really want to do is fire up a background thread at context initialization time.

<bean id="myRunnableThingy">
  ...
</bean>

<bean id="thingyThread" class="java.lang.Thread" init-method="start">
  <constructor-arg ref="myRunnableThingy"/>
</bean>


As another option, one can now use Spring's scheduling capabilities. With Spring 3 or higher, it has a cron like annotation that allows you to schedule tasks to run with a simple annotation of a method. It's also friendly with autowiring.

This example schedules a task for every 2 minutes with an initial wait (on startup) of 30 seconds. The next task will run 2 minutes after the method completes! If you want it to run every 2 minutes exactly, use fixedInterval instead.

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

}

Be sure to also add @EnableAsync @EnableScheduling to your Application class to enable this feature.

0

精彩评论

暂无评论...
验证码 换一张
取 消