spring-boot - 从 DB 读取数据后,将数据从一个写入器传递给另一个写入器
问题描述
我必须创建一个批处理作业,我需要从 1 个数据库中获取数据,并在处理后将该数据转储到另一个数据库,其中自动生成的 ID 将分配给持久数据。我需要将该数据连同生成的 ID 一起发送到安慰队列。
Reader(DB1) -- data1 --> Processor -- data2 --> Writer (DB2) -- data3 --> Writer (Solace Publisher)
我正在使用 spring boot-2.2.5.RELEASE 和 spring-boot-starter-batch。
我创建了一个具有 1 个步骤的作业,该步骤分别通过 RepositoryItemReader 和 RepositoryItemWriter 从 DB1 读取数据并将数据写入 DB2。这工作正常。
现在下一个任务是将已生成 ID 的持久数据发送到慰藉流(使用 spring-cloud-starter-stream-solace)。
我有以下问题。请协助,因为我对春季批次完全陌生
根据某些参数将记录保存到 DB2 后如何获取完整记录?我是否必须编写自己的具有 StepExecution Context 的 RepositoryItemWriter,或者我可以以某种方式使用现有的 RepositoryItemWriter。
一旦我得到记录,我需要使用慰藉流,并且我有发布方法,期望参数(记录)被发布。我再次想我需要编写自己的 Item Writer,或者我可以使用 StepExecutionContext 从上面的 repositoryItemWriter 传递的记录,还是应该根据某些参数直接从这里查询 DB2?
在上述任何一种情况下,我都需要使用 stepexecution 上下文,但我可以使用可用的 RepositoryItemWriter 还是必须自己编写?
是否有任何其他概念可以方便地使用而不是使用上述方法?
解决方案
将数据传递给未来的步骤是 Spring Batch 中的一种常见模式。根据文档https://docs.spring.io/spring-batch/docs/current/reference/html/common-patterns.html#passingDataToFutureSteps,您可以使用 stepExecution 来存储和检索您生成的 ID。在您的情况下,作者也是侦听器,其在步骤方法之前使用@BeforeStep 注释。例如:
public class DB2ItemWriter implements ItemWriter<Object> {
private StepExecution stepExecution;
public void write(List<? extends Object> items) throws Exception {
// ...
ExecutionContext stepContext = this.stepExecution.getExecutionContext();
stepContext.put("generatedIds", ids);
}
@BeforeStep
public void saveStepExecution(StepExecution stepExecution) {
this.stepExecution = stepExecution;
}
}
然后你在下一个作家中检索 id
public class SolacePublisherItemWriter implements ItemWriter<Object> {
public void write(List<? extends Object> items) throws Exception {
// ...
}
@BeforeStep
public void retrieveGeneratedIds(StepExecution stepExecution) {
ExecutionContext stepExecutionContext = stepExecution.getExecutionContext();
this.generatedIds = stepExecutionContext.get("generatedIds");
}
}
推荐阅读
- excel - 将数组中的单词匹配为字符串
- python - 如何对对象求和并在 for 循环中旋转?
- java - 如何对 JSONObject 的映射进行排序
- python - Pandas 中不同类别(子集/行组合)的平均滚动 6 个月
- css - 悬停时的 SVG 抖动动画
- java - 如果 Firebase 数据库没有子节点,则返回 Mainactivity
- python - Spacy:如何从句子标记化文本创建文档?
- mysql - 多人/单人测验游戏的数据库设计
- checkbox - “同意条款”-复选框更改错误消息
- asp.net-core - Swagger 集成到 Bot Framework 4