Как создать фоновый процесс в весеннем веб-приложении? - PullRequest
17 голосов
/ 21 декабря 2009

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

Ответы [ 3 ]

17 голосов
/ 21 декабря 2009

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

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

7 голосов
/ 22 декабря 2009

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

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

<bean id="thingyThread" class="java.lang.Thread" init-method="start">
  <constructor-arg ref="myRunnableThingy"/>
</bean>
4 голосов
/ 11 июля 2016

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

...