问题描述
在执行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语句中获取列表的键