2015-09-23 73 views
1

我正在寫一個業務邏輯在Tasklet中,我發送消息到外部systemA的隊列之一,然後停止使用operator.stop()方法的工作(有時反應來得很晚,所以我通過停止彈簧批量工作來釋放系統資源)。春天批量數據庫沒有得到更新

只要我收到systemA的回覆,我需要再次從上次完成的作業重新啓動作業。

這就是我在tasklet中所做的。

public RepeatStatus execute(StepContribution stepCon, ChunkContext chunkCtx) 
      throws Exception { 

     JobOperator operator= (JobOperator)ApplicationContextProvider.getApplicationContext().getBean("jobOperator"); 

      String msg = "some msg"; 
    //Sending message to channel created using spring integration. 
    messageChannel.send(MessageBuilder.withPayload(msg).build()); 
     //Stopping job with the job_exe_id 123 
      operator.stop(123); 
      ExitStatus es = new ExitStatus("MSG_SENT"); 
      stepCon.setExitStatus(es); 
      return null; 

    } 

,我現在面臨的問題是,一旦消息被髮送到系統A的隊列,在任何時候,我從SYSTEMA得到響應和Spring集成的服務激活被調用,由於某種原因春天批次DB永遠不會更新爲「已停止」,而是數據庫條目將作業的狀態顯示爲「正在停止」,因此我無法在服務激活器內重新啓動作業,因爲它仍處於「停止」狀態。

任何人都可以請讓我知道爲什麼春天的批量數據庫沒有得到「停止」狀態的狀態更新。

EDIT-我已經嘗試停止發送消息到SystemA的隊列之前的工作,但仍然彈簧BATCH數據庫沒有得到更新與「停止」狀態。

回答

0

當我從外部系統得到響應的時候,我發送郵件的tasklet的事務沒有被提交。

爲了解決我用一個步驟執行偵聽上述問題,我做了所有的DB更新我發送的消息發送到所述外部客戶端的「AfterStep的」執行偵聽tasklet裏面和內部,所以通過時間流到達「AfterStep的「執行監聽器,tasklet事務會被承諾。

希望這會幫助有需要的人。