spring-batch:将数据库上的一组查询并行转储为平面文件



因此,我的场景深入到本质如下:本质上,我有一个包含一组SQL查询的配置文件,这些查询的结果集需要导出为CSV文件。由于一些查询可能会返回数十亿行,并且某些事情可能会中断进程(bug、崩溃…),我想使用spring-batch这样的框架,它为我提供了重启和作业监控功能。我正在使用一个基于文件的H2数据库来持久化春季批处理作业。

因此,以下是我的问题:

  • 创建作业后,我需要为我的RowMapper提供一些初始配置。那么,当作业在例如崩溃后需要重新启动时会发生什么呢?具体而言:

    • RowMapper的状态是否自动持久化,并且在重新启动时,Spring批处理将尝试从其数据库中恢复对象,或者
    • 将使用作为原始spring-batch XML配置文件一部分的RowMapper对象,或者
    • 我必须使用步骤/作业的ExecutionContext来维护RowMapper的状态
  • 上面的问题与使用spring-batchXML配置时是否有魔力有关,或者我是否也可以用编程的方式创建所有这些bean:由于我需要将自己的配置格式解析为spring-batch作业配置,所以我宁愿只使用spring-battle的Java类(bean)并适当地填充它们,而不是尝试手动写出有效的XML。然而,如果我的工作崩溃了,我会重新创建所有的bean。spring-batch是否自动从其数据库中恢复作业状态?

  • 如果我真的需要XML,有没有办法将spring-batchJobRepository(或其中一个对象)序列化为spring-batch XML配置?

  • 现在,我试图用以下代码配置我的Step,但我不确定这是否是正确的方法:

    • TaskletStep是一条路吗
    • 我创建分块读写器的方式正确吗?或者我应该使用其他对象吗
    • 我本以为打开读取器和写入器会作为JobExecution的一部分自动发生,但如果我在运行Job之前没有打开这些资源,我会收到一个异常,告诉我需要先打开它们。也许我需要创建一些其他对象来管理资源(jdbc连接和文件句柄)?

      JdbcCursorItemReader<Foobar> itemReader = new JdbcCursorItemReader<Foobar>();
      itemReader.setSql(sqlStr);
      itemReader.setDataSource(dataSource);
      itemReader.setRowMapper(rowMapper);
      itemReader.afterPropertiesSet();
      ExecutionContext executionContext = new ExecutionContext();
      itemReader.open(executionContext);
      FlatFileItemWriter<String> itemWriter = new FlatFileItemWriter<String>();
      itemWriter.setLineAggregator(new PassThroughLineAggregator<String>());
      itemWriter.setResource(outResource);
      itemWriter.afterPropertiesSet();
      itemWriter.open(executionContext);
      
      int commitInterval = 50000;
      CompletionPolicy completionPolicy = new SimpleCompletionPolicy(commitInterval);
      RepeatTemplate repeatTemplate = new RepeatTemplate();
      repeatTemplate.setCompletionPolicy(completionPolicy);
      RepeatOperations repeatOperations = repeatTemplate;
      ChunkProvider<Foobar> chunkProvider = new SimpleChunkProvider<Foobar>(itemReader, repeatOperations);
      ItemProcessor<Foobar, String> itemProcessor = new ItemProcessor<Foobar, String>() {
      /* Custom implemtation */ };
      
      ChunkProcessor<Foobar> chunkProcessor = new SimpleChunkProcessor<Foobar, String>(itemProcessor, itemWriter);
      Tasklet tasklet = new ChunkOrientedTasklet<QuadPattern>(chunkProvider, chunkProcessor); //new SplitFilesTasklet();
      TaskletStep taskletStep = new TaskletStep(); 
      taskletStep.setName(taskletName);
      taskletStep.setJobRepository(jobRepository);
      taskletStep.setTransactionManager(transactionManager);    
      taskletStep.setTasklet(tasklet);
      taskletStep.afterPropertiesSet();
      job.addStep(taskletStep);
      

你们中的大多数问题都非常复杂,可能很难在不写长篇论文的情况下给出好的答案
我和你一样是spring-batch的新手,我发现了很多非常有用的信息-以及你问题的所有答案-阅读spring-batch:它已经完成,解释得很好,充满了示例,涵盖了框架的各个方面(读写器/处理器、作业/任务集/区块生命周期/持久性、tx/资源管理、作业流、与其他服务的集成、分区、重新启动/重试、故障管理和许多有趣的事情)
希望能帮助

最新更新