Как создать фоновый процесс в spring webapp?

Я хочу запустить фоновый процесс параллельно с моим веб-приложением spring -mvc. Мне нужен способ начать автоматически при загрузке контекста. Фоновый процесс - это класс, реализующий Runnable. Есть ли у spring -mvc какие-то средства для этого?

Ответы

Ответ 1

Spring имеет всеобъемлющую структуру выполнения задач. См. соответствующую часть документов.

Я предлагаю использовать Spring bean в вашем контексте, который при инициализации передает ваш фон Runnable на SimpleAsyncTaskExecutor bean. Это самый простой подход, который вы можете сделать более сложным и способным по своему усмотрению.

Ответ 2

Я бы продолжил и посмотрел на документацию по планированию задач, связанную с помощью скаффмана, но также более простой способ, если все, что вы действительно хотите сделать, - запустить фоновый поток в момент инициализации контекста.

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

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

Ответ 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, чтобы включить эту функцию.