1

バッチアプリケーションにSpringBatchを使用したいと思います。私はすでにDDDに従って設計されたドメインモデルを持っています。私の質問は、バッチ処理(私の場合はSpringバッチを使用)がDDDにどのように適合するかです。

たとえば、集約ルートAがあり、その子の1つがエンティティBです。Aには1つ以上のBのリストがあります。バッチアプリケーションは、各行がBのリストの操作(追加、削除...)に対応するときにファイルを受け取ります。集約ルートAには、操作ごとに1つのメソッドがあります(例: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 に答える