我們有要求將數據從1個數據庫移動到另一個數據庫並探索相同的彈簧批處理。我們的應用程序的用戶選擇源和目標數據源以及需要移動數據的表的列表。如何在運行時創建並啓動彈簧批處理作業
需要幫助的以下內容:
- 必要建立作業的信息都可以從我們的Web應用程序運行時 - 包括數據源的詳細信息和表名的列表。我們希望通過將這些詳細信息發送給作業生成器模塊並使用JobLauncher啓動它來創建新作業。我們如何編寫這個作業生成器模塊?
- 我們可能有多個用戶並行提出數據移動請求,因此需要創建多個作業並按適當順序運行它們的方法。
我們使用基於Java的配置來創建作業並從Web容器啓動它。該配置如下
@Bean
public Job loadDataJob(JobCompletionNotificationListener listener) {
RunIdIncrementer inc = new RunIdIncrementer();
inc.setKey(new Date().toString());
JobBuilder builder = jobBuilderFactory.get("loadDataJob")
.incrementer(inc)
.listener(listener);
SimpleJobBuilder simpleBuilder = builder.start(preExecute());
for(String s : getTables()){
simpleBuilder.next(etlTable(s));
}
simpleBuilder.next(postExecute());
return simpleBuilder.build();
}
@Bean
@Scope("prototype")
public Step etlTable(String tableName) {
return stepBuilderFactory.get(tableName)
.<Map<String,Object>, Map<String,Object>> chunk(1000)
.reader(dbDataReader(tableName))
.processor(processor())
.writer(dbDataWriter(tableName))
.build();
}
目前我們已經硬編碼的源和目標數據源的詳細信息到相應的豆類。 getTables()返回需要移動數據的表(硬編碼)的列表。即啓動該作業
@RestController
public class MyController {
@Autowired
JobLauncher jobLauncher;
@Autowired
Job job;
@RequestMapping("/launchjob")
public String handle() throws Exception {
try {
JobParameters jobParameters = new JobParametersBuilder().addLong("time", new Date().getTime()).toJobParameters();
jobLauncher.run(job, jobParameters);
} catch (Exception e) {
}
return "Done";
}
}
您分享的鏈接中的一些帖子幫助我們解決了其他問題。然而,主要關心的問題仍然存在 - 如何將Spring批處理作爲服務使用,以便在用戶請求數據移動時創建和運行作業?在啓動作業時發送作業參數似乎對發送複雜對象(在我們的例子中爲數據源細節+數據移動請求細節)有限制。 – ksh
我在回答中加了幾條評論。 –
根據你的建議,我們不再像春季豆一樣創造就業機會,它對我們的用例來說效果很好。請注意,如果沒有使用自動裝配和未使用註釋(如@EnableBatchProcessing),則需要爲JobRepository和Job/Step構建器工廠進行少量手動配置。現在只關注如果我們因爲這種變化而失去任何東西。一旦分析完成,將在這裏更新。 – ksh