当前位置: 首页 > 知识库问答 >
问题:

Spring Batch:在读取器和写入器之间传递数据

苏鸿羽
2023-03-14
LOG.info("INSIDE WRITE, NPAG: " + nPag);
@Component
public class LCItemReader implements ItemReader<String> {

private StepExecution stepExecution;

private int nPag = 1;

@Override
public String read() throws CustomItemReaderException {

    ExecutionContext stepContext = this.stepExecution.getExecutionContext();
    stepContext.put("npag", nPag);
    nPag++;
    return "content";
}

@BeforeStep
public void saveStepExecution(StepExecution stepExecution) {
    this.stepExecution = stepExecution;
}
}
@Component
@StepScope
public class LCItemWriter implements ItemWriter<String> {

private String nPag;

@Override
public void write(List<? extends String> continguts) throws Exception {
    try {
        LOG.info("INSIDE WRITE, NPAG: " + nPag);
    } catch (Throwable ex) {
        LOG.error("Error: " + ex.getMessage());
    }
}

@BeforeStep
public void retrieveInterstepData(StepExecution stepExecution) {
    JobExecution jobExecution = stepExecution.getJobExecution();
    ExecutionContext jobContext = jobExecution.getExecutionContext();
    this.nPag = jobContext.get("npag").toString();
}
}
@Bean
public Job lCJob() {
    return jobs.get("lCJob")
            .listener(jobListener)
            .start(lCStep())
            .build();
}

@Bean
public Step lCStep() {
    return steps.get("lCStep")
            .<String, String>chunk(1)
            .reader(lCItemReader)
            .processor(lCProcessor)
            .writer(lCItemWriter)
            .listener(promotionListener())
            .build();
}

听众

@Bean
public ExecutionContextPromotionListener promotionListener() {
    ExecutionContextPromotionListener executionContextPromotionListener = new ExecutionContextPromotionListener();
    executionContextPromotionListener.setKeys(new String[]{"npag"});
    return executionContextPromotionListener;
}

共有1个答案

翟永春
2023-03-14

ExecutionContextPromotionListener特别声明它在步骤结束时工作,因此在编写器执行之后。所以,我认为你指望的晋升不会在你认为它会发生的时候发生。

如果我是你,我会在步骤上下文中设置它,如果你需要一个步骤中的值,我会从步骤中获取它。否则,我会将其设置为作业上下文。

另一个方面是@beforestep。它标记要在步骤上下文存在之前执行的方法。在读取器中设置nPag值的方式应该是在步骤开始执行之后。

 类似资料:
  • 我有一个包含Reader->Processor->Writer的spring批处理。 B/W传递的数据类型为: 在中从CSV文件读取一个简单的批处理数据时,中的一些处理&输出CSV文件由编写。 请建议。如果你认为任何其他方法会更好,请建议。 谢谢

  • 问题内容: 我打算学习来自许多不同的MV *框架的AngularJS。我喜欢框架,但是在控制器之间传递数据时遇到了麻烦。 假设我有一个带有一些输入(input.html)的屏幕和一个控制器,比方说InputCtrl。 此视图上有一个按钮,可将您带到另一个屏幕,例如,使用控制器ApproveCtrl批准(approve.html)。 此ApproveCtrl需要来自InputCtrl的数据。在较大的

  • 如何写这个问题?老实说,我不明白这个问题的意思。A) 编写读者和作者优先于读者的解决方案,并评论每个信号量的功能。(记住变量和信号量的定义和初始化)B)读卡器的优先级意味着什么?当一个作家在写作时,到达的读者会发生什么?当编写器结束其操作时会发生什么?

  • 我有一个要求,我需要从xls(其中存在一个名为netCreditAmount的列)中读取值并将值保存在数据库中。要求是从所有行中添加netCreditAmount的值,然后在数据库中仅为xls中的第一行设置此总和,其余行插入相应的netCreditAmounts。我应该如何在Spring Batch中进行实施。普通的阅读器、处理器和写入器工作正常,但我应该在哪里插入这个实现?谢谢!

  • 项目读取器将数据从特定源代码读入Spring批处理应用程序,而项目写入器将数据从Spring Batch应用程序写入特定目标。 Item处理器是一个包含处理代码的类,该代码处理读入spring批处理的数据。 如果应用程序读取条记录,则处理器中的代码将在每条记录上执行。 块(chunk)是该tasklet的子元素。 它用于执行读取,写入和处理操作。 可以在如下所示的步骤中配置使用此元素的读取器,写入

  • 问题内容: 我是iOS和Objective-C以及整个MVC范例的新手,我坚持以下几点: 我有一个充当数据输入表单的视图,我想给用户选择多个产品的选项。产品在另一个视图上以列出,并且我启用了多个选择。 我的问题是,如何将数据从一个视图传输到另一个视图?我将把选择保留在一个数组中,但是如何将其传递回先前的数据输入表单视图,以便在提交表单时将其与其他数据一起保存到Core Data? 我到处冲浪,看到