我正在构建修改给定数量记录的弹簧批处理作业。记录ID列表是作业的输入参数。例如,一项工作可能是:修改记录ID {1,2,3,4}并在相关表上设置参数X和Y.编写弹簧式批处理的正确方法ItemReader
因为我无法将潜在的很长的输入列表(tipical个案,50K记录)传递给我的ItemReader,所以我只传递一个MyJobID,然后itemReader用来加载目标ID列表。
问题是,结果代码出现“错误”(虽然它的工作原理),而不是春季批次的精神。这里的读者:
@Scope(value = "step", proxyMode = ScopedProxyMode.INTERFACES)
@Component
public class MyItemReader implements ItemReader<Integer> {
@Autowired
private JobService jobService;
private List<Integer> itemsList;
private Long jobId;
@Autowired
public MyItemReader(@Value("#{jobParameters['jobId']}") final Long jobId) {
this.jobId = jobId;
this.itemsList = null;
}
@Override
public Integer read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException {
// First pass: Load the list.
if (itemsList == null) {
itemsList = new ArrayList<Integer>();
MyJob myJob = (MyJob) jobService.loadById(jobId);
for (Integer i : myJob.getTargedIdList()) {
itemsList.add(i);
}
}
// Serve one at a time:
if (itemsList.isEmpty()) {
return null;
} else {
return itemsList.remove(0);
}
}
}
我试图read()方法的第一部分移动到构造,但@Autowired引用是空在这一点上。之后(在读取方法上),它被初始化。
有没有更好的方法来编写ItemReader?我想移动“负载”或者这是该场景的最佳解决方案?
谢谢。
显示jobService.loadById()的代码,我会回来反馈。 –