Как создать фоновый процесс в весеннем веб-приложении?
-
20-09-2019 - |
Вопрос
Я хочу запустить фоновый процесс параллельно с моим веб-приложением Spring-mvc.Мне нужен способ автоматического запуска при загрузке контекста.Фоновый процесс — это класс, реализующий Runnable
.Есть ли у Spring-MVC какие-то возможности для этого?
Решение
Spring имеет комплексную структуру выполнения задач.См. соответствующая часть документов.
Я предлагаю иметь в вашем контексте bean-компонент Spring, который при инициализации передает ваш фон Runnable
к SimpleAsyncTaskExecutor
боб.Это самый простой подход, который вы можете сделать более сложным и эффективным по своему усмотрению.
Другие советы
Я бы пошел дальше и посмотрел документацию по планированию задач, на которую ссылается skaffman, но есть и более простой способ, если все, что вам действительно нужно, это запустить фоновый поток во время инициализации контекста.
<bean id="myRunnableThingy">
...
</bean>
<bean id="thingyThread" class="java.lang.Thread" init-method="start">
<constructor-arg ref="myRunnableThingy"/>
</bean>
В качестве другого варианта теперь можно использовать возможности планирования Spring.В Spring 3 или выше есть аннотация, подобная cron, которая позволяет планировать запуск задач с помощью простой аннотации метода.Это также дружит с автопроводкой.
В этом примере задача назначается каждые 2 минуты с начальным ожиданием (при запуске) 30 секунд.Следующая задача будет запущена через 2 минуты после завершения метода!Если вы хотите, чтобы он запускался ровно каждые 2 минуты, используйте вместо этого фиксированный интервал.
@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 в ваш класс приложений, чтобы включить эту функцию.