2013-08-19 60 views
0

嗨,我是新的春季批。是在春天批次嵌套塊可能

我的情況與春季一批象下面這樣:

我需要運行的所有促銷活動[促銷列表]

  • 每個促銷活動,我需要準備與屬性提升動態查詢批並獲得所有的交易歷史記錄並計算每個用戶的促銷積分

    而這裏的上述動態查詢我想從批處理中再次讀取,因爲它返回的結果至少有5萬條記錄。

下面是我期待的過程,這是可能的春季批?

  • 讀促銷[閱讀器讀取促銷逐個]
    • 創建查詢,並把它放在上下文
    • 它傳遞給下一個讀者
      • 讀者通過一個
      • 進程讀取一個事務交易和計算積分
    • 處理器

我在這裏的問題是不能寫嵌套塊[一個用於讀促銷和一個用於讀取交易。

一種選擇是:

分區作業每個促銷活動,在這一切的宣傳會同時運行,但我們需要運行一個一個之後。

任何機構可以爲此提出任何方法嗎?

+0

您是否找到其他解決方案?我很感興趣,因爲在不太長的時間裏,我會面臨同樣的問題 –

回答

1

不能嵌套塊,所以你可以把你自己的CompositeItemReader像(僞代碼):

class CompositeItemReader implements ItemReader<Transaction> { 
    ItemReader<Promotion> promotions; 
    ItemReader<Transaction> transactions; 

    public void setPromotions(ItemReader<Promotion> promotions) {...} 

    public Transaction read() { 
    Transaction item = transactions.read(); 
    if(null == item) { 
     Promotion p = promotions.read(); 
     if(null != p) { 
     // Close transactions reader, create dynamic query and open transaction reader 
     // Re-read item! 
     item = this.read(); 
     } 
    } 

    return item; 
    } 
} 

但記得要登記促銷和交易作爲流並記住管理重啓。
或者,如果你確定每個振興有關聯交易的限制列表<>,你可以使用一個ItemProcessor<Promotion,List<Transaction>>,其將像(駕駛基於查詢的ItemReaders)單促銷:

class PromotionProcessor implements ItemProcessor<Promotion,List<Transaction>> { 
    public List<Transaction> process(Promotion item) { 
    Query q = <create dynamic query>; 
    return q.list(); 
    } 
} 

否則的解決方案基於PeekableItemReader和數據持有者就像一個描述here

希望這種考慮可以幫助!做得好!