0

我有以下要求:

  1. 一个端点 http://localhost:8080/myapp/jobExecution/myJobName/execute 接收 CSV 并使用单一性来应用一些验证并生成一些 pojo 的列表。
  2. 将该列表发送到 Spring Batch Job 进行一些处理。
  3. 多个用户可以这样做。

我想知道使用 Spring Batch 是否可以实现这一目标?

我正在考虑使用队列,放置数据并执行从该队列中提取对象的作业。但是我怎么能确定如果其他人执行端点并且其他 Job 正在执行,Spring Batch 知道哪个 Item 属于某个执行?

4

2 回答 2

1

是的。Spring boot 将在不同的线程中执行这些作业。所以 Spring 知道哪些项目属于哪个执行。注意:您可以使用类似记录相关 ID。这将帮助您过滤特定请求的日志。https://dzone.com/articles/correlation-id-for-logging-in-microservices

于 2020-05-09T05:53:45.483 回答
1

您可以使用队列或继续将步骤之后生成的值列表与验证一起放入作业执行上下文中,并将其作为作业参数的一部分存储。

下面是将列表存储到作业上下文并使用 ItemReader 读取列表的片段。

Snippet 在 Tasklet 步骤中实现 StepExecutionListener 以放置构造的 List,

@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”作为具有 Reader(允许一次读取一个线程)、Processor 和 Writer 的 Step 的一部分读取。您还可以将其存储为 Queue 的一部分并在 Reader 中获取。片段供参考,

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..
}
于 2020-05-09T07:08:26.330 回答