2014-01-30 27 views
1

我試圖在並行的Spring批處理作業中處理一些步驟。作業的XML配置如下:Spring批處理並行Seam上下文,沒有應用程序上下文活動

<batch:job id= "job" job-repository = "jobRepository"> 
    <batch:split id="split" task-executor="taskExecutor"> 
    <batch:flow> 
     <batch:step id = "step1"> 
     <batch:tasklet transaction-manager = "txManager" > 
      <batch:chunk reader   = "reader1" 
         processor   = "processor1" 
         writer   = "writer1" 
         commit-interval = "1" /> 
     </batch:tasklet> 
     </batch:step> 
    </batch:flow> 
    <batch:flow> 
     <batch:step id = "step2"> 
     <batch:tasklet transaction-manager = "txManager"> 
      <batch:chunk reader   = "reader2" 
         processor   = "processor2" 
         writer   = "writer2" 
         commit-interval = "1" /> 
     </batch:tasklet> 
     </batch:step> 
    </batch:flow> 
    </batch:split> 
</batch:job> 

taskExecutor是一個SimpleAsyncTaskExecutor。

在大塊中,我使用的是閱讀器,處理器和寫入器。這些都依賴於Seam(2.2.2)。

當這些步驟以單線程模式運行時,它們都可以正常工作。但是當它們並行運行時,它們會導致錯誤,因爲沒有可用的Seam上下文。很明顯,因爲創建了一個新線程,並且沒有啓動Seam生命週期(Lifecycle.beginCall())。

我如何確保在處理我的塊時啓動生命週期?我真的不想在我的閱讀器中啓動一個生命週期,並在作者中結束它,但應該在tasklet執行時開始,並在tasklet完成時結束。剛剛步執行之前

回答

0

啓動背景:

<batch:step id="step1"> 
     <batch:tasklet> 
      <batch:chunk ...> 
      </batch:chunk> 
     </batch:tasklet> 
     <batch:listeners> 
      <batch:listener ref="stepExecutionListener"/> 
     </batch:listeners> 
    </batch:step> 

stepExecutionListener:

public abstract class MyStepExecutionListener implements StepExecutionListener { 

    @Override 
    public void beforeStep(StepExecution stepExecution) { 
     Lifecycle.beginCall(); 
    } 

    /** 
    * Default no-op implementation. 
    * @return ExitStatus of step. 
    */ 
    @Override 
    public ExitStatus afterStep(StepExecution stepExecution) { 
     return stepExecution.getExitStatus(); 
    } 
} 
相關問題