首页 文章

Spring批处理中的多个项目编写者

提问于
浏览
20

我正在编写一个Spring批处理,我正在读取一大块数据,处理它然后我希望将这些数据传递给2个编写器 . 一个编写器只是更新数据库,而第二个编写器将写入csv文件 .

我打算编写自己的自定义编写器并在customItemWriter中注入两个itemWriters,并在customItemWriter的write方法中调用两个item编写器的write方法 . 这种方法是否正确?是否有任何符合我要求的ItemWriter实现?

提前致谢

5 回答

  • 2

    您可以使用Spring的CompositeItemWriter并将其委托给所有作者 .
    这是configuration example .

  • 0

    你是对的 . SB非常基于委托,因此使用CompositeItemWriter是您需要的正确选择 .

  • 0

    您不必像示例那样使用xml . 如果其余代码使用注释,则只需执行以下操作即可 .

    public ItemWriter<T> writerOne(){
        ItemWriter<T> writer = new ItemWriter<T>();
        //your logic here
        return writer;
    }
    
    public ItemWriter<T> writerTwo(){
        ItemWriter<T> writer = new ItemWriter<T>();
        //your logic here
        return writer;
    }
    
    public CompositeItemWriter<T> compositeItemWriter(){
        CompositeItemWriter writer = new CompositeItemWriter();
        writer.setDelegates(Arrays.asList(writerOne(),writerTwo()));
        return writer;
    }
    
  • 8

    根据您的需要,另一个选项是扩展Writer类并在那里添加功能 . 例如,我有一个项目,我正在扩展HibernateItemWriter,然后覆盖write(List items) . 然后我将我正在编写的对象和sessionFactory一起发送到Writer的doWrite方法:doWrite(sessionFactory,filteredRecords) .

    所以在上面的例子中,我可以写入扩展类中的csv文件,然后HibernateItemWriter将写入数据库 . 显然,这可能不是这个例子的理想选择,但对于某些情况,这是一个不错的选择 .

  • 16

    Java Config方式SpringBatch4

    @Bean
        public Step step1() {
                return this.stepBuilderFactory.get("step1")
                                        .<String, String>chunk(2)
                                        .reader(itemReader())
                                        .writer(compositeItemWriter())
                                        .stream(fileItemWriter1())
                                        .stream(fileItemWriter2())
                                        .build();
        }
    
        /**
         * In Spring Batch 4, the CompositeItemWriter implements ItemStream so this isn't
         * necessary, but used for an example.
         */
        @Bean
        public CompositeItemWriter compositeItemWriter() {
                List<ItemWriter> writers = new ArrayList<>(2);
                writers.add(fileItemWriter1());
                writers.add(fileItemWriter2());
    
                CompositeItemWriter itemWriter = new CompositeItemWriter();
    
                itemWriter.setDelegates(writers);
    
                return itemWriter;
        }
    

相关问题