2013-12-17 99 views
0

工作/步驟的細節我設立這三個數據庫之間移動數據批處理作業。我打算使用開箱即用的批處理類來處理來自第一個數據庫的查詢,但是我想在提取中包含當前作業/步驟的詳細信息。示例彈簧配置可能看起來像這樣訪問Spring Batch的通過通用的查詢提供

<bean id="jdbcPagingItemReader" class="org.springframework.batch.item.database.JdbcPagingItemReader"> <property name="dataSource" ref="dataSource"/> 
    <property name="pageSize" value="1000"/> 
    <property name="fetchSize" value="100"/> 
    <property name="queryProvider"> 
     <bean class="org.springframework.batch.item.database.support.HsqlPagingQueryProvider"> 
      <property name="selectClause" value="select id, bar"/> 
       <property name="fromClause" value="foo"/> 
       <property name="sortKeys"> 

是否有通過groovy或SpEL訪問當前JobExecution的方法?我在access-spring-batch-job-definition上找到了這個線索,但是假定了自定義代碼。

+0

如果你想包括關於當前工作/步此信息? –

+0

我有一個功能請求,說明用戶想要知道在同一個作業中有多少行插入到各個DB中。有幾種方法可以做到這一點,但我所看到的當前選項是使用spring batch job id,這將允許我將報告鏈接回spring batch admin。 – emeraldjava

+1

我認爲這可能[回答] [1]你的問題。簡而言之,這是不可能的。 [1]:http://stackoverflow.com/questions/17149302/how-to-get-job-id-using-spring-expression-language –

回答

1

所以我不是100%肯定你正在嘗試完成你的配置是在SORTKEYS進入切斷。這就是說,使用步驟作用域,您可以注入對JobExecution有參考的StepExecution。獲取JobExecution會是這個樣子:上一步上下文存在

<bean id="jdbcPagingItemReader" class="org.springframework.batch.item.database.JdbcPagingItemReader"> 
    … 
    <property id="jobExecution" value="#{stepExecution.jobExecution}"/> 
</bean> 
1

寫入次數(StepExecution.getWriteCount()),所以首先你需要將其提升到JobExecutionContext。

我建議使用與@AfterStep註釋的步驟偵聽此

@Component 
public class PromoteWriteCountToJobContextListener implements StepListener { 
    @AfterStep 
    public ExitStatus afterStep(StepExecution stepExecution){ 
     int writeCount = stepExecution.getWriteCount(); 
     stepExecution.getJobExecution().getExecutionContext() 
     .put(stepExecution.getStepName()+".writeCount", writeCount); 
     return stepExecution.getExitStatus(); 
    } 
} 

是執行插入每一步都將與此聽者中添加

<batch:step id="readFromDB1WrietToDB2" next="readFroDB2WrietToDB3"> 
      <batch:tasklet transaction-manager="transactionManager"> 
       <batch:chunk reader="reader" writer="writter" /> 
      </batch:tasklet> 
      <batch:listeners> 
       <batch:listener ref="promoteWriteCountToJobContextListener"/> 
      </batch:listeners> 
    </batch:step>  
    <batch:step id="readFromDB2WrietToDB3" next="summerizeWrites"> 
      <batch:tasklet transaction-manager="transactionManager"> 
       <batch:chunk reader="reader" writer="writter" /> 
      </batch:tasklet> 
      <batch:listeners> 
       <batch:listener ref="promoteWriteCountToJobContextListener"/> 
      </batch:listeners> 
    </batch:step> 

您可以使用log4j的寫入結果在Step Listener中登錄,或者您可以在以後的步驟中使用保存的值。您需要使用規劃環境地政司表示讀它,使用規劃環境地政司表示你需要設置Writter /任務蕾在範圍=「臺階」

<batch:step id="summerizeWrites"> 
     <batch:tasklet id="summerizeCopyWritesTaskelt""> 
      <bean class="Tasklet" scope="step"> 
       <property name="writeCountsList"> 
        <list> 
         <value>#{jobExecutionContext['readFromDB1WrietToDB2.writeCount']}</value> 
         <value>#{jobExecutionContext['readFromDB2WrietToDB3.writeCount']}</value> 
        </list> 
       </property> 
      </bean> 
     </batch:tasklet> 
相關問題