1

我想将 Spring 批处理用于批处理应用程序。我已经有一个按照 DDD 设计的域模型。我的问题是批处理(在我的情况下,使用 Spring 批处理)如何适合 DDD?

例如,我有一个聚合根 A,它的一个子节点是实体 B。A 有一个包含一个或多个 B 的列表。当每行对应于 B 列表上的一个操作(添加、删除...)时,批处理应用程序会收到一个文件。在我的聚合根 A 中,每个操作都有一个方法(例如 addB、delB...)。使用 Spring 批处理,我应该使用哪个 ItemWriter?我不认为 JdbcBatchItemWriter 是合适的,因为我应该只通过域处理数据。是否有关于在批处理中使用 DDD 的最佳实践?

谢谢

4

1 回答 1

1

我不会假装知道最佳实践到底是什么,但考虑到您的设计目标,这就是我的做法。而不是 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;
    }
}

希望这可以帮助。

于 2012-04-16T15:12:52.590 回答