如何获取当前资源名称

问题描述

我正在使用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;
}

谢谢

解决方法

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;
   }
}

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...