SpringBatch-組合寫,複雜業務邏輯批處理必備「乾貨」

Java XML 技術 用Java打醬油 用Java打醬油 2017-09-23

SpringBatch-組合寫,複雜業務邏輯批處理必備「乾貨」

適用版本

  1. SpringBatch 3.0.8

  2. Spring4.3

SpringBatch面臨的現實問題

SpringBatch框架的批處理能力毋庸置疑,java批處理新規範JSR-352即是受其深度影響。但是其官方提供的API在實際運用中還是收到了挑戰,比如在實際場景中一個任務(Step)會更新多張表,而SpringBatch官方提供的API一個Step只能更新一張表。可能有人會說可以在Processor中更新數據,不用全部在ItemWriter中更新數據,沒錯,這雖然能解決功能性上的問題,但破壞了SpringBatch的數據處理模型:ItemReader->Processor->ItemWriter,且性能上也不會好,要知道Processor中每次拿到的只是“一條數據”,在大數據量的更新操作上,使用不到JDBC的Batch功能。

複合寫功能實現

MyBatis官方提供了組合寫人ItemWriter:org.springframework.batch.item.support.CompositeItemWriter,但是很遺憾,使用起來並不方便,主要體現在參數的傳遞上。

場景

複合寫要解決的應用場景是一個Step更新一張主張,多張從表、子表。模型如下:

SpringBatch-組合寫,複雜業務邏輯批處理必備「乾貨」

模型

模型對象示例代碼:

可以有多張從表,多張子表,這裡是示意,只定義了一個。

SpringBatch-組合寫,複雜業務邏輯批處理必備「乾貨」

JavaBean定義

關鍵點

通過SpringBatch數據處理模型:ItemReader ==》 Processor ==》ItemWriter可以看到,T是我們的業務邏輯處理對象,O是更新數據的對象。對於組合寫場景,O必然是一個複雜對象,不會是簡單的JavaBean。而且組合寫中的多個ItemWriter拿到的對象必然不一樣。

MyBatis提供的示例中缺乏對於上述模型的支持。

MyBatisComplexItemWriter實現

這裡的ItemWriter與一般的Writer不同之處是可以獲取模型中取得當前wirter需要處理的數據。

先給出XML配置, compositetWriters配置了兩張表的數據寫入操作,T_DESTCREDIT(主表)、T_TRADE_RECORD(子表)。MyBatisComplexItemWriter是自定義類,主要作用是從主模型中取得當前ItemWriter需要的數據,並做校驗,然後將實際的數據寫入操作委派給MyBatisBatchItemWriter。ttradeRecordWriter這個bean的配置即是標準的MyBatis的ItemWriter配置,不再贅述。

SpringBatch-組合寫,複雜業務邏輯批處理必備「乾貨」

itemWriter配置

MyBatisComplexItemWriter實現

itemWriter配置

MyBatisComplexItemWriter實現

SpringBatch-組合寫,複雜業務邏輯批處理必備「乾貨」

MyBatisComplexItemWriter(1)

SpringBatch-組合寫,複雜業務邏輯批處理必備「乾貨」

MyBatisComplexItemWriter(2)

SpringBatch-組合寫,複雜業務邏輯批處理必備「乾貨」

MyBatisComplexItemWriter(3)

更多java開發請關注我的頭條,完整請示例私信我!

相關推薦

推薦中...