2012-04-16 194 views
1

我想爲批處理應用程序使用Spring批處理。我已經有了一個根據DDD設計的領域模型。我的問題是如何批處理(在我的情況下,使用Spring批處理)如何適合DDD?DDD和批處理(例如使用Spring批處理)

例如,我有一個聚合根A,其中一個子項是實體B. A有一個或多個B的列表。批處理應用程序在每行對應於Bs列表中的操作(添加,刪除...)時接收文件。在我的聚合根A中,每個操作都有一個方法(例如addB,delB ...)。使用Spring批處理,我應該使用哪個ItemWriter?我不認爲JdbcBatchItemWriter被佔用,因爲我只能通過域來處理數據。是否有關於使用DDD進行批處理的最佳做法?

感謝

+0

你用什麼爲你的數據訪問層? Spring Batch集成了幾個開箱即用的功能,並且可以通過使用ItemWriterAdapter輕鬆地適應其他人。 – 2012-04-16 13:55:52

+0

A是一個聚合根,所以我有一個ARepository。我已經使用Hibernate實現了存儲庫。但正如我所說,我不認爲我應該使用HibernateWriter,因爲我不能直接與數據庫通信,所以我應該只與域模型通信。 – 2012-04-16 14:17:05

回答

1

我不會假裝知道到底我們的最佳實踐是什麼,但是這是我怎麼會做它,考慮您的設計目標。相反,A和B的,說我們有一個文件對象,你的骨料,其中包含許多行:

class File { 
    public void addLine(Line l) {/* implementation here*/} 
    public void removeLine(Line l) {/* implementation here*/} 
} 

class Line { 
} 

讓你的閱讀器/處理器返回LineOperations,封裝你行(你剛纔讀)和是否你正在做添加/刪除/其他:

的AddOperation的
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); 
    } 
} 

實現和其他任何你可能需要留給了想象力。

接下來,我們將把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; 
    } 
} 

希望這會有所幫助。

+0

感謝您的回答。你有關於這對性能的影響的想法嗎?在常規的批處理中,寫入操作是在塊行上完成的,在這種情況下,每行都會調用執行方法。 – 2012-04-18 11:42:55

+0

你必須嘗試一下並找出答案,但大多數ItemWriters都遵循相同的模式。在這種情況下,我假定實際的數據訪問調用發生在您的ARepository(本例中爲FileRepository),這是在循環之外。 – 2012-04-18 13:28:38