Пакет Spring: как запустить задание, но не выполнить его, но выполнить его в другом экземпляре Java

#spring-batch

#spring-batch

Вопрос:

Я планирую использовать Spring Batch. Нам нравится инициировать выполнение новых заданий в наших модулях, которые отвечают на запросы интерфейса.

Псевдокод:

 @PostMapping(path = "/request-report/{id}")
public void requestReport(String id){
  this.jobOperator.start("reportJob", new Properties("1"));
}
 

Но мы не хотим, чтобы задание выполнялось во интерфейсном модуле. Для этого мы хотели бы создать отдельный модуль микросервиса.

Я вижу следующие решения:

  1. выполните вызов rest из модуля интерфейса в модуль spring-batch и запустите задание там. я мог бы это сделать, но, если возможно, я хотел бы пропустить этот шаг и интегрировать его в spring batch db.
  2. в модуле внешнего интерфейса я создаю JobLauncher, который имеет SimpleAsyncTaskExecutor с нулевым размером. Таким образом, он никогда не выполнит задание.

https://docs.spring.io/spring-batch/docs/current/reference/html/job.html#configuringJobLauncher

 @Bean
public JobLauncher jobLauncher() {
    SimpleJobLauncher jobLauncher = new SimpleJobLauncher();
    jobLauncher.setJobRepository(jobRepository());
    jobLauncher.setTaskExecutor(new SimpleAsyncTaskExecutor());
    jobLauncher.afterPropertiesSet();
    return jobLauncher;
}
 
  1. в интерфейсном модуле я не использую BatchAutoConfiguration, но просматриваю некоторые вещи, но что?

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

Спасибо за помощь!

Ответ №1:

Если вы настроите средство запуска заданий с помощью a SimpleAsyncTaskExecutor , оно будет запускать задания в отдельных потоках в одной и той же JVM (следовательно, в одном и том же контейнере и модуле).

Поэтому, если вы не предоставите пользовательский TaskExecutor интерфейс, который запускает задания в отдельной JVM / container / pod, вам нужно будет изменить свою архитектуру, чтобы использовать очередь заданий. В разделе Запуск пакетных заданий с помощью сообщений из справочных документов показано, как настроить такой шаблон.