Отправка данных в Spring Batch Item Reader (или Tasklet) - PullRequest
0 голосов
/ 09 мая 2020

У меня есть следующее требование:

  1. Конечная точка http://localhost: 8080 / myapp / jobExecution / myJobName / execute , которая получает CSV и использует univocity для применения некоторых проверок и сгенерируйте список некоторых pojo.
  2. Отправьте этот список в Spring Batch Job для некоторой обработки.
  3. Несколько пользователей могут это сделать.

Я хочу знать, смогу ли я добиться этого с помощью Spring Batch?

Я думал использовать очередь, поместить данные и выполнить задание, которое извлекает объекты из этой очереди. Но как я могу быть уверен, что если другой человек выполняет конечную точку, а другое задание выполняется, Spring Batch знает, какой элемент относится к определенному выполнению?

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 09 мая 2020

Вы можете использовать очередь или go вперед, чтобы поместить список значений, который был сгенерирован после шага с проверками, и сохранить его как часть параметров задания в контексте выполнения задания.

Ниже приведен фрагмент для сохранения списка в контексте задания и чтения списка с помощью ItemReader.

Snippet реализует StepExecutionListener на этапе Tasklet, чтобы поместить созданный список,

@Override
public ExitStatus afterStep(StepExecution stepExecution) {
    //tenantNames is a List<String> which was constructed as an output of an evaluation logic
    stepExecution.getJobExecution().getExecutionContext().put("listOfTenants", tenantNames); 
    return ExitStatus.COMPLETED;
}

Теперь «listOfTenants» читаются как часть шага, который имеет средство чтения (чтобы можно было читать по одному потоку за раз), процессор и средство записи. Вы также можете сохранить его как часть Очереди и получить в Читателе. Фрагмент для справки,

public class ReaderStep implements ItemReader<String>, StepExecutionListener {

   private List<String> tenantNames;

   @Override
   public void beforeStep(StepExecution stepExecution) {

       try {
           tenantNames = (List<String>)stepExecution.getJobExecution().getExecutionContext()
                .get("listOfTenants");
           logger.debug("Sucessfully fetched the tenant list from the context");
       } catch (Exception e) {
           // Exception block
       }
   }

   @Override
   public synchronized String read() throws Exception {

      String tenantName = null;

       if(tenantNames.size() > 0) {
          tenantName = tenantNames.get(0);
          tenantNames.remove(0);
          return tenantName;
       }

       logger.info("Completed reading all tenant names");
       return null;
   }

   // Rest of the overridden methods of this class..
}
1 голос
/ 09 мая 2020

Да. Spring boot будет выполнять эти задания в разных потоках. Итак, Spring знает, какие элементы какому исполнению принадлежат. Примечание: вы можете использовать как идентификатор корреляции журнала. Это поможет вам фильтровать журналы по конкретному запросу. https://dzone.com/articles/correlation-id-for-logging-in-microservices

...