Как создать фоновый процесс в 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, чтобы включить эту функцию.