2015-10-06 139 views
2

我需要爲正在處理的其中一個項目實現ETL應用程序。使用Spring批處理實現ETL

它具有以下步驟:

  1. 需要從表中讀取檢索一些值,這將是 中傳遞過來的工作參數。
  2. 步驟1的返回對象將進一步用於檢索 來自第二個表的一些數據。
  3. 然後必須從平面文件讀取,該文件將與步驟2中的 值一起使用。應用業務邏輯。然後寫入表格。

我們正在使用Spring Data JPA,Spring集成。

我面臨的挑戰是讀取表格中的值以檢索作業的參數,然後啓動作業。

然後步驟2的輸出必須與文件信息一起發送以進一步處理。

我知道如何獨立實施上述步驟,但努力將它們從頭到尾捆綁在一起。

分享任何想法來設計上述將是偉大的。提前致謝。

回答

0

我會盡量給你一些想法,爲你的不同點。

1 - 讀取表值,並將它們傳遞作爲作業參數

我看到2個解決方案,在這裏:

你可以做一個「手動」查詢(即沒有springbatch),然後做你的業務邏輯傳遞結果JobParameters(你只需要一個JobLauncherCommandLineJobRunner,見Springbatch Documentation §4.4):

JobLauncher jobLauncher = (JobLauncher) context.getBean("jobLauncher"); 
Job job = (Job) context.getBean(jobName); 

// Do your business logic and your database query here. 

// Create your parameters 
JobParameter parameter = new JobParameter(resultOfQuery); 

// Add them to a map 
Map<String, JobParameter> parameters = new HashMap<String, JobParameter>(); 
parameters.add("yourParameter", parameter); 

// Pass them to the job 
JobParameters jobParameters = new JobParameters(parameters); 
JobExecution execution = jobLauncher.run(job, parameters); 

其他的解決辦法是要添加一個JobExecutionListener並覆蓋方法beforeJob來執行您的查詢,然後將結果保存在executionContext(然後您可以使用它訪問:#{jobExecutionContext[name]})。

@Override 
public void beforeJob(JobExecution jobExecution) { 

    // Do your business logic and your database query here. 

    jobExecution.getExecutionContext().put(key, value); 
} 

在每種情況下,您都可以使用SpringBatch ItemReader來進行查詢。你可以,例如,申報項目的讀者作爲現場爲您的監聽器(不要忘了二傳手),並將其配置爲這樣:

<batch:listener> 
    <bean class="xx.xx.xx.YourListener"> 
     <property name="reader"> 
      <bean class="org.springframework.batch.item.database.JdbcCursorItemReader"> 
       <property name="dataSource" ref="dataSource"></property> 
       <property name="sql" value="${yourSQL}"></property> 
       <property name="rowMapper"> 
        <bean class="xx.xx.xx.YourRowMapper"></bean> 
       </property> 
      </bean> 
     </property> 
    </bean> 
</batch:listener> 

2 - 根據上一步驟結果表讀

再次,您可以使用JobExecutionContext在步驟之間存儲和檢索數據。然後,您可以實施StepExecutionListener以覆蓋方法beforeStep並訪問StepExecution,這會導致您進入JobExecution

3 - 從表讀數一起閱讀

沒有「默認」 CompositeItemReader這將讓你在同一時間2源讀取數據文件的結果發送結果,但我不認爲這是什麼你真的想要做。

對於你的情況,我會申報「表讀者」爲讀者在<batch:chunk>然後聲明定製ItemProcessor這將有另一場ItemReader。這位讀者將是您的FlatFileItemReader。然後,您可以手動啓動讀取,並在process方法中應用您的業務邏輯。

+0

謝謝Alex。讓我嘗試一下建議的方法,看看它是如何發展的 – Alpajna

相關問題