首页 > 解决方案 > 从 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-bootspring-batchsolace

解决方案


将数据传递给未来的步骤是 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");
    }
}

推荐阅读