我不会假装知道最佳实践到底是什么,但考虑到您的设计目标,这就是我的做法。而不是 A 和 B,假设我们有一个 File 对象,你的聚合,它包含许多行:
class File {
public void addLine(Line l) {/* implementation here*/}
public void removeLine(Line l) {/* implementation here*/}
}
class Line {
}
让您的阅读器/处理器返回 LineOperations,封装您的行(您刚刚阅读)以及您是否正在执行添加/删除/其他:
interface LineOperation {
public void execute(File file);
}
class DeleteOperation implements LineOperation {
private Line line;
private DeleteOperation(Line line) {
super();
this.line = line;
}
public void execute(File file) {
file.removeLine(line);
}
}
AddOperation 的实现以及您可能需要的任何其他内容都留给想象。
接下来,我们会将 LineOperations 传递给您的作者。您的编写器对聚合文件执行操作,然后使用 FileRepository 写入聚合。
class LineOperationWriter implements ItemWriter<LineOperation>, StepExecutionListener {
@Autowired;
FileRepository fileRepo;
private Long fileId;
public void write(List<? extends LineOperation> items) throws Exception {
File file = fileRepo.find(fileId);
for (LineOperation lineOperation : items) {
lineOperation.execute(file);
}
fileRepo.persist(file);
}
@Override
public void beforeStep(StepExecution stepExecution) {
this.fileId = (Long) stepExecution.getJobExecution().getExecutionContext().get("fileId");
}
@Override
public ExitStatus afterStep(StepExecution stepExecution) {
return null;
}
}
希望这可以帮助。