2012/03/09

Message in a Bottle:Spring Batch DuplicateKeyException 處理紀錄(未解)


之前使用 spring batch,因為客戶要求寫 db 時,不能因為 primary key duplicate 而終止 batch。

所以我在 chunk 加了 skip-limit 的 property,並且設定

<skippable-exception-classes>
  <include class="org.springframework.dao.DuplicateKeyException" />
</skippable-exception-classes>

然後,昨天遇到了一狀況:
1. 查詢 batch_step_execution table 時,會發現 rollback_count 會是 write_skip_count 的兩倍。
2. 假設有兩筆資料 primary key 相同,且當 writer 是 db writer 時,會正確寫入一筆。
3. 承 2.,當 writer 是 composite writer 時 ( db writer + file writer ),這兩筆都不會寫入( db 和 file 皆如此)。

所以我在 chunk 後加上了

<no-rollback-exception-classes>
  <include class="org.springframework.dao.DuplicateKeyException"/>
</no-rollback-exception-classes>

承 3.,db 就正常了(寫入一筆),但是 file 依然兩筆都不寫。

還好 file 只是用來輔助檢查之用,經客戶確認可接受此狀況,所以就沒有繼續調整。

紀錄一下,看之後有沒有解決方法。