首页 > 解决方案 > 如何获取当前资源名称

问题描述

我正在使用 MultiResourceItemReader 来读取并最终将 CSV 文件列表写入数据库。

@StepScope
@Bean
public MultiResourceItemReader<DailyExport> multiResourceItemReader(@Value("#{stepExecutionContext[listNotLoadedFilesPath]}") List<String> notLoadedFilesPath) {
    logger.info("** start multiResourceItemReader **");         
    
    // cast List of not loaded files to array of resources
    List <Resource>tmpList = new ArrayList<Resource>();
    notLoadedFilesPath.stream().forEach(fullPath -> {   
          Resource resource =  new FileSystemResource(fullPath);
          tmpList.add(resource);
      });
    Resource [] resourceArr = tmpList.toArray(new Resource[tmpList.size()]);
    
    MultiResourceItemReader<DailyExport> multiResourceItemReader = new MultiResourceItemReader<>();
    multiResourceItemReader.setName("dailyExportMultiReader");
    multiResourceItemReader.setDelegate(reader(dailyExportMapper()));
    multiResourceItemReader.setResources(resourceArr);
    return multiResourceItemReader;
}

@Bean
public FlatFileItemReader<DailyExport> reader(FieldSetMapper<DailyExport> testClassRowMapper) {
    logger.info("** start reader **");

    // Create reader instance
    FlatFileItemReader<DailyExport> reader = new FlatFileItemReaderBuilder<DailyExport>()
            .name("dailyExportReader")
            .linesToSkip(1).fieldSetMapper(testClassRowMapper)
            .delimited().delimiter("|").names(dailyExportMetadata)
            .build();
    return reader;
}

一切运行良好,但我还需要存储当前文件\资源名称。

我找到了这个 API getCurrentResource但我不知道如何使用它。有没有办法在流程阶段获取当前资源?

public class DailyExportItemProcessor implements ItemProcessor<DailyExport, DailyExport>{

@Autowired
public MultiResourceItemReader<DailyExport> multiResourceItemReader;
@Override
public DailyExport process(DailyExport item) throws Exception {
  // multiResourceItemReader.getCurrent ??
    
       
    return item;
}

谢谢

标签: springspring-bootspring-batch

解决方案


ResourceAware是您所需要的,它允许您在项目上设置原始资源,以便您可以在处理器(或项目在范围内的任何其他地方)中访问它:

class DailyExport implement ResourceAware {

   private Resource resource;
   // getter/setter for resource
}

然后在处理器中:

public class DailyExportItemProcessor implements ItemProcessor<DailyExport, DailyExport>{

   @Override
   public DailyExport process(DailyExport item) throws Exception {
      Resource currentResource = item.getResource();
      // do something with the item/resource
      return item;
   }
}

推荐阅读