【问题标题】:Spring Batch - Read a byte stream, process, write to 2 different csv files convert them to Input stream and store it to ECS and then write to DatabaseSpring Batch - 读取字节流,处理,写入 2 个不同的 csv 文件,将它们转换为输入流并将其存储到 ECS,然后写入数据库
【发布时间】:2020-12-31 00:21:32
【问题描述】:

我有一个要求,我们通过 ECS S3 预签名 URL 接收字节流形式的 csv 文件。我必须验证数据并将验证成功和失败的记录写入 2 个不同的 csv 文件,然后通过将它们转换为 InputStream 将它们存储到 ECS S3 存储桶中。还将成功记录写入数据库,以及入站、成功和失败文件的预签名 url。

我是 Spring Batch 的新手。我应该如何处理这个要求?

如果我选择一个 FlatFileItemReader 来读取,ItemProcessor 来处理数据我应该如何写入不同的文件和数据库?

我应该使用 Tasklet 创建作业吗? TIA。

【问题讨论】:

  • 请检查下面是好的 - 选项 1。我可以分享代码 sn-p。 Reader--->Processor(使用成功和失败结果验证和更新对象)-->CompositeWriter(SuccessWriter+Failure Writer)
  • 以上将是您更好的选择,而不是在侦听器验证中处理。请让我知道我可以分享代码 sn-p。确认后我可以分享为答案
  • 这会很有帮助,你能分享一个代码sn-p。谢谢!

标签: java spring-boot amazon-s3 spring-batch


【解决方案1】:

请在下面找到示例代码 sn-p 。如果您遇到任何问题,请告诉我

 //Your InputOutPut DTO This is the key object
   Class BaseCSVDTO {
    // yourCSVMappedFields  
    private SuccessCSVObject successObject;
    private FailureCSVObject failureObject;
   }

   //Read the Files in reader as Normal better create a custom reader if you want to get more control
    @Bean
    public ItemReader<BaseCSVDTO> yourFlatFileItemReader() {
        
         //populate mapped fields automatically by Springbatch
    }

    @Bean
    public CSVProcessor csvValidationProcessor() {
        return new CSVProcessor();
    }
    
    Class CSVProcessor implements ItemProcessor<BaseCSVDTO, BaseCSVDTO> {
        @Override
        public BaseCSVDTO CSVProcessor(BaseCSVDTO eachCSVitem) throws Exception {
            //validateEachItem and put in Success or Failure Object
            //Example of Success
                SuccessCSVObject successObject = new SuccessCSVObject()
                eachCSVitem.setSuccessObject(successObject);
            //Same way for Failure object   
        }
    }

   @Bean
    public CompositeItemWriter compositeWriter() throws Exception {
        CompositeItemWriter compositeItemWriter = new CompositeItemWriter();
        List<ItemWriter> writers = new ArrayList<ItemWriter>();
        writers.add(successCSVWriter());
        writers.add(failureCSVWriter());
        compositeItemWriter.setDelegates(writers);
        return compositeItemWriter;
    }

    @Bean
    public YourItemWriter<BaseCSVDTO> successCSVWriter() {
        return new SuccessWriter();
    }

    @Bean
    public YourItemWriter<BaseCSVDTO> failureCSVWriter() {
        return new FailureWriter;
    }

    
    public class SuccessWriter implements ItemWriter<BaseCSVDTO> {
        @Override
        public void write(List<? extends BaseCSVDTO> items){
        for(BaseCSVDTO baseCSVDTO:items) {
            baseCSVDTO.getSuccessObject
          //write Success CSV 
        }
        }
    }

  public class FailureWriter implements ItemWriter<BaseCSVDTO> {
        @Override
        public void write(List<? extends BaseCSVDTO> items){
        for(BaseCSVDTO baseCSVDTO:items) {
          //write Success CSV 
          baseCSVDTO.getFailureObject
        }
        }
    }

    /// Finally Job step
    @Bean
    public Step executionStep() throws Exception {
        return stepBuilderFactory.get("executionStep").<BaseCSVDTO, BaseCSVDTO>chunk(chunkSize)
                .reader(yourFlatFileItemReader()).processor(csvValidationProcessor()).writer(compositeWriter())
                //.faultTolerant()
                //.skipLimit(skipErrorCount).skip(Exception.class)//.noSkip(FileNotFoundException.class)
                //.listener(validationListener())
                //.noRetry(Exception.class)
                //.noRollback(Exception.class)
                .build();
    }

【讨论】:

  • 非常感谢您分享此代码 sn-p 但我必须将创建的 csv 文件转换为字节流以将其存储到 ecs s3 存储桶中,因此如果我以块的形式写入 csv 文件我应该何时/在哪里将创建的文件转换为字节流?
  • 此外,将这些文件存储到 ecs s3 存储桶后,我应该检索两个文件的预签名 url 并将其写入 db
  • 在编写器中,您将作为单独的 java 对象获得成功和失败,您可以使用 JAVA IO 字节流或 OpenCSV 字节流编写此 java 对象
  • 在 SuccessWriter 和 failure Writer 中,如果您希望使用 jdbc 模板写入 DB 或创建另一个 writer 并添加 Composite writer,您可以根据需要执行大量操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-07
  • 1970-01-01
  • 2010-11-22
  • 2021-12-03
  • 1970-01-01
  • 2015-09-10
  • 2014-07-03
相关资源
最近更新 更多