【问题标题】:Spring Batch: How to create a Composite Item Writer?Spring Batch:如何创建复合项目编写器?
【发布时间】:2018-06-06 16:01:01
【问题描述】:

我在Spring Boot 应用程序中使用Spring BatchSpring Boot 版本是 1.3.5.RELEASE

我正在尝试使用CompositeItemWriter,以便项目列表将首先由 WriterOne 压缩/压缩,然后传递给 WriterTwo,然后将它们写入数据库。

这是我的作家 1:

@Component
public class Writer1 implements org.springframework.batch.item.ItemWriter<SimpleObject>  {
    @Override
    public void write(List<? extends SimpleObject> list) throws Exception {
        for(SimpleObject simpleObject: list){
            // code which compresses the file
        }
    }
}

这是我的作家 2:

@Component
public class Writer2 implements org.springframework.batch.item.ItemWriter<SimpleObject>  {
    @Override
    public void write(List<? extends SimpleObject> list) throws Exception {
        for(SimpleObject simpleObject: list){
            // the file object meta data are being writtren to database.
        }
    }
}

这是我正在尝试初始化任务步骤并为其提供 CompositeItemWriter 而不是 ItemWriter。

CompositeItemWriter compositeItemWriter = new CompositeItemWriter();
compositeItemWriter.setDelegates(Arrays.asList(writer1,writer2));
TaskletStep processingStep = stepBuilderFactory.get(getLabel() + "-" + UUID.randomUUID().toString())
                        .<SimpleObject, SimpleObject>chunk(5)
                        .reader(reader)
                        .processor(processor)
                     .writer(compositeItemWriter).transactionManager(txManager).build();

然后代码给出编译时错误:

Error:(337, 83) java: cannot find symbol
  symbol:   method build()
  location: class org.springframework.batch.core.step.builder.StepBuilderHelper

【问题讨论】:

    标签: java spring-boot spring-batch tasklet compositeitemwriter


    【解决方案1】:

    以下代码适用于我的情况。

    这是我的作家 1:

    @Component
    public class Writer1 implements ItemStreamWriter<SimpleObject>,org.springframework.batch.item.ItemWriter<SimpleObject>  {
        @Override
        public void write(List<? extends SimpleObject> list) throws Exception {
            for(SimpleObject simpleObject: list){
                // some logic
                }
            }
        }
    
        @Override
        public void open(ExecutionContext executionContext) throws ItemStreamException {
    
        }
    
        @Override
        public void update(ExecutionContext executionContext) throws ItemStreamException {
    
        }
    
        @Override
        public void close() throws ItemStreamException {
    
        }
    }
    

    这是我的作家 2:

    @Component
    public class Writer2 implements ItemStreamWriter<SimpleObject>, org.springframework.batch.item.ItemWriter<SimpleObject>  {
        @Override
        public void write(List<? extends SimpleObject> list) throws Exception {
            for(SimpleObject simpleObject: list){
               // some logic 
            }
        }
    
        @Override
        public void open(ExecutionContext executionContext) throws ItemStreamException {
    
        }
    
        @Override
        public void update(ExecutionContext executionContext) throws ItemStreamException {
    
        }
    
        @Override
        public void close() throws ItemStreamException {
    
        }
    }
    

    这里我正在尝试初始化Tasklet 并为其提供CompositeItemWriter

    CompositeItemWriter<SimpleObject> compositeItemWriter = new CompositeItemWriter<>();
                    List<org.springframework.batch.item.ItemWriter<? super SimpleObject>> delegates = new ArrayList<>();
                    delegates.add(writer1);
                    delegates.add(writer2);
                    compositeItemWriter.setDelegates(delegates);
    
                    TaskletStep processingStep = stepBuilderFactory.get(getLabel() + "-" + UUID.randomUUID().toString())
                            .<SimpleObject, SimpleObject>chunk(5)
                            .reader(reader)
                            .processor(processor)
                            .writer(compositeItemWriter)
                            .stream(writer1)
                            .stream(writer2)
                            .transactionManager(txManager)
                            .build();
    

    如果我遗漏了什么或有一些不正确的信息,请告诉我。

    【讨论】:

    • 你介意展示你的 txManager 吗?您是如何创建该对象的?
    • @Ashish - 在我们的例子中,当第一个写入器出现任何异常时,CompositeItemWriter 不会委托给第二个写入器和第三个写入器。我们如何解决这个问题?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-30
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 2012-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多