搭建批處理框架問題總結Spring Batch + Spring Batch Admin + Quartz
Transaction Manager 事務管理器問題:
問題現象:在Tasklet中呼叫Dao update更新資料,發現數據庫沒有變。
問題分析:猜測是沒有commit
原來,我用了spring batch admin作為批處理介面管理,
但是spring-batch-admin-manager*.jar內部data-source-context.xml定義了資料來源和事務管理器
與我的dao模組的datasource, transaction manager衝突了。
這裡實際用了兩個事務管理器:
* 1)transactionManager 用於spring batch登記BATCH_開頭的框架相關表:
* 配置在spring-batch-manager.jar的data-source-context.xml中.
* JobRepository, JobRegistry, JobLauncher, JobService都是使用這個事務管理器。
*
* 2) 用於 控制TaskletStep中(呼叫dao)業務邏輯資料的提交和回滾,
* 所以必須和act-dao中的mybatis事務管理器txManager是同一個物件,才能讓spring batch在TransactionTemplate中自動提交和回滾
* 如果spring batch和Dao使用的事務管理器不是同一個,會導致Dao的更新丟失.
原來的程式碼自動注入有問題,用的是上面1) transactionManager:
@Resource
PlatformTransactionManager transactionManager;
taskletStep.setTransactionManager(transactionManager);
解決方案:TaskletStep改為和Dao一樣,使用2) txManager
@Resource(name="txManager")
PlatformTransactionManager txManager;
taskletStep.setTransactionManager(txManager);