【问题标题】:spring batch read different files at runtimespring批处理在运行时读取不同的文件
【发布时间】:2018-04-06 21:22:18
【问题描述】:

我有一个需要配置的春季批处理作业。从某种意义上说,它应该能够根据传递的内容读取不同的文件并构建阅读器,并且可能每个不同的阅读器都有自己的写入器。下面的示例读取一个文件,我称其为 writer。如何使 load_area.txt 成为动态的。

   @Bean
  public Step orderStep() {
      return stepBuilderFactory.get("loadAStep")
              .<FieldSetter, FieldSetter> chunk(3)
              .reader(reader())
              .processor(processor())
              .writer(writer())
              .build();
  }

  @Bean
  public FlatFileItemReader<FieldSetter> reader() {
      FlatFileItemReader<FieldSetter> reader = new FlatFileItemReader<FieldSetter>();
      reader.setResource(new ClassPathResource("load_a.txt"));
      reader.setLineMapper(new DefaultLineMapper<GenericFieldSetter>() {{
          setLineTokenizer(new DelimitedLineTokenizer("|") {{
              setNames(new String[] { "sCode","cName"});
          }});
          setFieldSetMapper(new BeanWrapperFieldSetMapper<FieldSetter>() {{
              setTargetType(FieldSetter.class);
          }});
      }});
      return reader;
  }

   @Bean
  public ItemWriter<GenericFieldSetter> writer() {
    return new LoadAreaItemWriter();
  }

load_a.txt 22|RRR

load_b.txt aa|ABCDED|123|0000

我想根据传递的内容在运行时读取 load_a.txt 或 load_b.txt 并编写自己的编写器。有可能是 .txt 或任何类型。

FieldSetter.java 有 setter 和 getter

【问题讨论】:

    标签: spring-batch reader


    【解决方案1】:

    您可以使用jobExecutionContext/stepExecutionContext 动态传递文件名。你的 bean 应该有@StepScope

    这是您可以访问jobExecutionContext/stepExecutionContext的方式

    @Bean
     @StepScope
      public FlatFileItemReader<FieldSetter> reader("#{jobExecutionContext['fileName']}") final String fileName ,@Value("#{stepExecutionContext['fileName']}") String filename1) {
          FlatFileItemReader<FieldSetter> reader = new FlatFileItemReader<FieldSetter>();
          reader.setResource(new ClassPathResource(fileName));
          reader.setLineMapper(new DefaultLineMapper<GenericFieldSetter>() {{
              setLineTokenizer(new DelimitedLineTokenizer("|") {{
                  setNames(new String[] { "sCode","cName"});
              }});
              setFieldSetMapper(new BeanWrapperFieldSetMapper<FieldSetter>() {{
                  setTargetType(FieldSetter.class);
              }});
          }});
          return reader;
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 2012-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多