首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >弹簧批次: CompositeItemWriter,@BeforeStep并控制StepExecution

弹簧批次: CompositeItemWriter,@BeforeStep并控制StepExecution
EN

Stack Overflow用户
提问于 2021-02-09 10:02:22
回答 1查看 572关注 0票数 0

我最近偶然发现了一个关于春季批量的非常扭曲的问题。所需经费如下:

我有两个主要步骤:

  • 第一个从oracle数据库中读取一些数据,从一个表中写入另一个表,第二个
  • 根据第一步处理的数据进行其他一些数据库操作。

从设计角度来看,第一步如下所示:

代码语言:javascript
复制
    @Bean
    public Step myFirstStep(JdbcCursorItemReader<Revision> reader) {

        return stepBuilderFactory.get("my-first-step")
            .<Revision, Revision>chunk(1)
            .reader(readerRevisionNumber)
            .writer(compositeItemWriter())
            .listener(executionContextPromotionListener())
            .build();

复合项目编写者:

代码语言:javascript
复制
    @Bean
    public CompositeItemWriter<Revision> compositeItemWriter() {
        CompositeItemWriter writer = new CompositeItemWriter();
        writer.setDelegates(Arrays.asList(somewriter(), someOtherwriter(), aWriterThatIsSupposedToPassDataToAnotherStep()));
        return writer;
    }

虽然前两位作家并不复杂,但我的兴趣集中在第三位作家身上。

代码语言:javascript
复制
aWriterThatIsSupposedToPassDataToAnotherStep()

正如您可能已经猜到的那样,这一项将用于获取之前正在处理的一些数据,以便在我的第二步中推广它:

代码语言:javascript
复制
@Component
@StepScope
public class AWriterThatIsSupposedToPassDataToAnotherStep implements ItemWriter<SomeEntity> {

    private StepExecution stepExecution;

    public void write(List<? extends SomeEntity> items) {

        ExecutionContext stepContext = this.stepExecution.getExecutionContext();
        stepContext.put("revisionNumber", items.stream().findFirst().get().getSomeField());
        System.out.println("writing : " + items.stream().findFirst().get().getSomeField()+ "to ExecutionContext");
    }

    @BeforeStep
    public void saveStepExecution(StepExecution stepExecution) {
        this.stepExecution = stepExecution;
    }

}

问题是:只要这个作者是复合作者列表(如上面声明的)的一部分,我的最后一个作者的@BeforeStep就永远不会被执行,这就导致我无法将我的信息传输到执行上下文。当用步骤内的单个"AWriterThatIsSupposedToPassDataToAnotherStep“替换我的CompositeItemWriter时,它会被正确地执行。

它一定要对某种申报令做些什么吗?

非常感谢进一步的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-09 11:32:28

找到了解决方案(在我的同事的帮助下),并从:https://stackoverflow.com/a/39698653/1957764获得了资源。

您需要将写入器声明为复合写入器的一部分,并将其声明为步骤侦听器,以使其执行@BeforeStep注释方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66116740

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档