如何将列表从StepExecutionListener传递到MultiResourceItemReader

问题描述

在执行StepExecutionListener.beforeStep()的过程中,我正在使用数据库中的数据启动资源列表。

@Component
public class DailyExportStepExecutionListener implements StepExecutionListener {

@Autowired
private JdbcTemplate jdbcTemplate;
@Autowired
private ResourceLoader resourceLoader;
private List<Resource> listResource;

public DailyExportStepExecutionListener() {
    listResource = new ArrayList<Resource>();
}

public List<Resource> getListResource() {
    return listResource;
}

@Override
public void beforeStep(StepExecution stepExecution) {
    jdbcTemplate.query("SELECT FullPath FROM DailyExportMetadata",(rs,row) -> listResource.add(resourceLoader.getResource(rs.getString(1))));
}

最终我想做的是使用MultiResourceItemReader的资源列表

@Bean
public MultiResourceItemReader<DailyExport> multiResourceItemReader(FieldSetMapper<DailyExport> testClassRowMapper) {

    MultiResourceItemReader<DailyExport> multiResourceItemReader = new MultiResourceItemReader<>();
    multiResourceItemReader.setName("dailyExportMultiReader");
    multiResourceItemReader.setDelegate(reader(testClassRowMapper));
    multiResourceItemReader.setStrict(true);
    multiResourceItemReader.setResources(??);
    
    return multiResourceItemReader;
}

如何在组件之间传递ArrayList?

谢谢

解决方法

名为multiResourceItemReader的方法的目的是构建将在作业中使用的项目读取器,以便它在作业开始之前并因此在执行beforeStep之前执行。

如果可以,则应在配置时执行sql以填充listResource :例如,在带有注释的@Bean方法中:

@Bean
public List<Resource> listResource(JdbcTemplate jdbcTemplate,ResourceLoader resourceLoader) {
    List<Resource> listResource;
    jdbcTemplate.query("SELECT FullPath FROM DailyExportMetadata",(rs,row) -> listResource.add(resourceLoader.getResource(rs.getString(1))));
    return listResource;
}

multiResourceItemReader方法类似于:

@Bean
public MultiResourceItemReader<DailyExport> multiResourceItemReader(FieldSetMapper<DailyExport> testClassRowMapper,List<Resource> listResource) {

    MultiResourceItemReader<DailyExport> multiResourceItemReader = new MultiResourceItemReader<>();
    multiResourceItemReader.setName("dailyExportMultiReader");
    multiResourceItemReader.setDelegate(reader(testClassRowMapper));
    multiResourceItemReader.setStrict(true);
    multiResourceItemReader.setResources(listResource);
    
    return multiResourceItemReader;
}

如果您无法在开始作业之前初始化listResource ,则应按照本文(Set IteamReader input from ExecutionContext)中的说明进行操作。 beforeStep方法应在步骤执行上下文中将listResource放入这样:

stepExecution.getExecutionContext().put("listResource",listResource);

"listResource"是用于在multiResourceItemReader方法的@Value语句中获取列表的键

相关问答

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