将数据发送到 Spring Batch Item Reader(或 Tasklet)
Send data to Spring Batch Item Reader (or Tasklet)
我有以下需求:
- 一个端点 http://localhost:8080/myapp/jobExecution/myJobName/execute,它接收 CSV 并使用单向性来应用一些验证并生成一些 pojo 的列表。
- 将该列表发送到 Spring 批处理作业进行一些处理。
- 多个用户可以执行此操作。
我想知道 Spring 批处理是否可以实现这个目标?
我正在考虑使用队列,放入数据并执行从该队列中提取对象的作业。但是我如何确定如果其他人执行端点并且其他 Job 正在执行,Spring Batch 知道哪个 Item 属于某个执行?
是的。 Spring boot 会在不同的线程中执行这些作业。所以 Spring 知道哪些项目属于哪个执行。
注意:您可以使用类似日志记录的关联 ID。这将帮助您过滤特定请求的日志。 https://dzone.com/articles/correlation-id-for-logging-in-microservices
您可以使用队列或继续将验证步骤后生成的值列表放入作业执行上下文中,并将其作为作业参数的一部分存储。
下面是将列表存储到作业上下文并使用项目读取列表的代码段Reader。
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(允许一次读取一个线程)、处理器和写入器。您还可以将其存储为 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..
}
我有以下需求:
- 一个端点 http://localhost:8080/myapp/jobExecution/myJobName/execute,它接收 CSV 并使用单向性来应用一些验证并生成一些 pojo 的列表。
- 将该列表发送到 Spring 批处理作业进行一些处理。
- 多个用户可以执行此操作。
我想知道 Spring 批处理是否可以实现这个目标?
我正在考虑使用队列,放入数据并执行从该队列中提取对象的作业。但是我如何确定如果其他人执行端点并且其他 Job 正在执行,Spring Batch 知道哪个 Item 属于某个执行?
是的。 Spring boot 会在不同的线程中执行这些作业。所以 Spring 知道哪些项目属于哪个执行。 注意:您可以使用类似日志记录的关联 ID。这将帮助您过滤特定请求的日志。 https://dzone.com/articles/correlation-id-for-logging-in-microservices
您可以使用队列或继续将验证步骤后生成的值列表放入作业执行上下文中,并将其作为作业参数的一部分存储。
下面是将列表存储到作业上下文并使用项目读取列表的代码段Reader。
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(允许一次读取一个线程)、处理器和写入器。您还可以将其存储为 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..
}