Как создать фоновый процесс в весеннем веб-приложении?

StackOverflow https://stackoverflow.com/questions/1939229

Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top