2

我使用Spring Batch的,我有以下結構(層)設計一個批處理應用程序:批和業務層通信

  • 頂模塊,我把所有的Spring Batch的代碼(閱讀文件,處理和寫作)。此頂層模塊特定於文件的特定格式。所以,我可能在未來會有一個新的並行模塊,能夠讀取/處理/寫入新的格式。獨立於格式,文件的每一行對應於要執行的特定操作。例如,每行可以表示操作「將訂單項X添加到訂單Y」。所以,對於每一行,在完成讀取和處理之後,我使用一個自定義的ItemWriter來調用緊接着的下一層所需的操作。
  • 將實現不同批處理操作的業務邏輯層。這些操作中的每一個都是使用域圖層對象實現的。例如,通過使用OrderRepository檢索訂單,然後調用訂單的addLineItem方法,可以實現「Add line ite; X to order Y」操作。
  • 我擁有所有域對象的域圖層。在前面的例子之後,我有Order和LineItem實體。

我的問題是:

  • 是否有一個最好的做法(也許一個具體的設計模式),以用於頂部模塊和業務邏輯層之間的界面?
  • 我們假設每個文件只包含一行訂單。編寫每行的天真方法是每行調用一個批處理操作。在這種情況下,對於每一行,都會調用OrderRepository來檢索訂單,然後保存訂單。我正在考慮另一種方法,其中的行是用塊寫的(就像我們用Spring批處理一樣)。寫操作所採用的參數具有List類型。按照第二種方法,我需要向業務操作傳遞它需要將數據塊添加到相關訂單中的數據。在頂層模塊和業務邏輯層之間使用哪種形式傳遞信息?

感謝

回答

3

是否有一個最好的做法(也許一個具體的設計模式),以用於 頂部模塊和業務邏輯層之間的界面?

AFAIK有沒有真正的最佳實踐,而不同,以已知的最佳實踐,但批次經常需要處理的性能要求/約束​​,甚至更多的時候產生的性能問題,所以我最好的做法是:

  • 想想數據和數據流
  • 有多少數據?
  • 什麼是瓶頸? (處理VS寫作,經常寫作部分)

給你一些靈感的作家和業務層的接口

  1. 使用ItemWriterAdapter,它可以使用businessLayer。addOrderItem方法
  2. 寫自己的包裝
  3. 移動業務層到作家,也很少再使用一批真正需要優化的業務層

我會選擇2去,因爲在批處理方面,我想用列表和批量SQL

照常這取決於您的具體要求:-)

ItemWriter wrapp ER例如

public class SimpleItemWriter implements ItemWriter<SimpleItem> { 

    @Override 
    public void write(List<? extends SimpleItem> items) throws Exception {   
     // do something, e.g. delegate to another spring bean 
    } 
} 

ItemWriterAdapter配置示例

<bean id="sample-item-writer-adapter" class="org.springframework.batch.item.adapter.ItemWriterAdapter"> 
    <property name="targetObject" ref="businessLayerBean" /> 
      <property name="targetMethod" value="doSomething" 
</bean> 

<step id="splitFilesStep"> 
    <tasklet> 
     <chunk 
      reader="itemReader" 
      writer="sample-item-writer-adapter" 
      commit-interval="5"> 
     </chunk> 
    </tasklet> 
</step>