首页 文章

spring批处理在运行时读取不同的文件

提问于
浏览
0

我有一个需要配置的 spring 批处理作业 . 从某种意义上说,它应该能够根据传递的内容读取不同的文件并构建阅读器,并且可能每个不同的阅读器都有自己的编写器 . 下面的例子读取一个文件,然后调用它的编写器 . 如何使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

1 回答

  • 0

    您可以使用 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;
      }
    

相关问题