我是 Spring-Batch 技术的新手,请帮助了解如何在应用程序运行时传递动态列表到 ListItemReader 并将其存储到 MySql DB。
例如。我从数据库中获取一些值并对获取的数据进行一些计算,然后准备一个列表和这个新列表以传递给 ListItemReader 并将其存储到数据库中。
感谢您的帮助。
最佳答案
下面是 ListItemWriter 和 ListItemReader 的自定义实现,它允许您定义 name
属性。此属性用作将列表存储在 JobExecutionContext
中的键。
根据您的情况,您可以执行 3 个步骤:
- JDBCReader > ListItemWriter
- 计算任务
- ListItemReader > JDBCWriter
如果您的tasklet需要获取列表,您可以使用与下面相同的方式(即读/写JobExecutionContext
)。
读者:
public class CustomListItemReader<T> implements ItemReader<T>, StepExecutionListener {
private String name;
private List<T> list;
@Override
public T read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException {
if (list != null && !list.isEmpty()) {
return list.remove(0);
}
return null;
}
@Override
public void beforeStep(StepExecution stepExecution) {
list = (List<T>) stepExecution.getJobExecution().getExecutionContext().get(name);
}
@Override
public ExitStatus afterStep(StepExecution stepExecution) {
return null;
}
public void setName(String name) {
this.name = name;
}
}
作者:
public class CustomListItemWriter<T> implements ItemWriter<T>, StepExecutionListener {
private String name;
private List<T> list = new ArrayList<T>();
@Override
public void write(List<? extends T> items) throws Exception {
for (T item : items) {
list.add(item);
}
}
@Override
public void beforeStep(StepExecution stepExecution) {}
@Override
public ExitStatus afterStep(StepExecution stepExecution) {
stepExecution.getJobExecution().getExecutionContext().put(name, list);
return null;
}
public void setName(String name) {
this.name = name;
}
}
关于mysql - spring batch - 如何在应用程序运行时传递动态列表到 ListItemReader 将其存储到数据库中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33209655/