2015-09-01 60 views
4

我無法讓條件彈簧批處理流使用java配置工作。我在春季批處理樣本或Spring批次的測試代碼或堆棧溢出中看到的示例傾向於顯示一個條件,其中一個步驟需要在條件下執行,或者是最後一個步驟,或者兩者兼而有之。這不是我需要解決的問題。無法獲得彈簧批處理條件流工作

在程序僞代碼,我希望它表現得像

initStep() 
if decision1() 
    subflow1() 
middleStep() 
if decision2() 
    subflow2() 
lastStep() 

所以,subflow1和2是有條件的,但INIT,中間和最後總是執行。這是我精簡的測試用例。在當前的配置中,它只是在執行subflow1之後退出。

public class FlowJobTest { 

private JobBuilderFactory jobBuilderFactory; 
private JobRepository jobRepository; 
private JobExecution execution; 

@BeforeMethod 
public void setUp() throws Exception { 
    jobRepository = new MapJobRepositoryFactoryBean().getObject(); 
    jobBuilderFactory = new JobBuilderFactory(jobRepository); 
    execution = jobRepository.createJobExecution("flow", new JobParameters()); 
} 

@Test 
public void figureOutFlowJobs() throws Exception { 

    JobExecutionDecider subflow1Decider = decider(true); 
    JobExecutionDecider subflow2Decider = decider(false); 

    Flow subflow1 = new FlowBuilder<Flow>("subflow-1").start(echo("subflow-1-Step-1")).next(echo("subflow-1-Step-2")).end(); 
    Flow subflow2 = new FlowBuilder<Flow>("subflow-2").start(echo("subflow-2-Step-1")).next(echo("subflow-2-Step-2")).end(); 

    Job job = jobBuilderFactory.get("testJob") 
      .start(echo("init")) 

      .next(subflow1Decider) 
       .on("YES").to(subflow1) 
      .from(subflow1Decider) 
       .on("*").to(echo("middle")) 
      .next(subflow2Decider) 
       .on("YES").to(subflow2) 
      .from(subflow2Decider) 
       .on("*").to(echo("last")) 

      .next(echo("last")) 
      .build().preventRestart().build(); 

    job.execute(execution); 
    assertEquals(execution.getStatus(), BatchStatus.COMPLETED); 
    assertEquals(execution.getStepExecutions().size(), 5); 
} 


private Step echo(String stepName) { 
    return new AbstractStep() { 
     { 
      setName(stepName); 
      setJobRepository(jobRepository); 
     } 
     @Override 
     protected void doExecute(StepExecution stepExecution) throws Exception { 
      System.out.println("step: " + stepName); 
      stepExecution.upgradeStatus(BatchStatus.COMPLETED); 
      stepExecution.setExitStatus(ExitStatus.COMPLETED); 
      jobRepository.update(stepExecution); 
     } 
    }; 
} 

private JobExecutionDecider decider(boolean decision) { 
    return (jobExecution, stepExecution) -> new FlowExecutionStatus(decision ? "YES" : "NO"); 
} 

} 

回答

4

你原來的工作定義也應該起作用,只需要很小的調整。由於作業在第一個子流之後完成(狀態爲COMPLETED),所以測試失敗。如果您指示它繼續中間步驟,它應該按預期工作。對第二個流程的類似調整。

Job job = jobBuilderFactory.get("testJob") 
     .start(echo("init")) 

     .next(subflow1Decider) 
      .on("YES").to(subflow1).next(echo("middle")) 
     .from(subflow1Decider) 
      .on("*").to(echo("middle")) 
     .next(subflow2Decider) 
      .on("YES").to(subflow2).next(echo("last")) 
     .from(subflow2Decider) 
      .on("*").to(echo("last")) 

     .build().preventRestart().build(); 
0

我用來完成這項工作的方法是將我的條件流分解爲流程步驟。

public void figureOutFlowJobsWithFlowStep(boolean decider1, boolean decider2, int expectedSteps) throws Exception { 

    JobExecutionDecider subflow1Decider = decider(decider1); 
    JobExecutionDecider subflow2Decider = decider(decider2); 

    Flow subFlow1 = new FlowBuilder<Flow>("sub-1") 
      .start(subflow1Decider) 
      .on("YES") 
      .to(echo("sub-1-1")).next(echo("sub-1-2")) 
      .from(subflow1Decider) 
      .on("*").end() 
      .end(); 
    Flow subFlow2 = new FlowBuilder<Flow>("sub-2") 
      .start(subflow2Decider) 
      .on("YES").to(echo("sub-2-1")).next(echo("sub-2-2")) 
      .from(subflow2Decider) 
      .on("*").end() 
      .end(); 

    Step subFlowStep1 = new StepBuilder("sub1step").flow(subFlow1).repository(jobRepository).build(); 
    Step subFlowStep2 = new StepBuilder("sub2step").flow(subFlow2).repository(jobRepository).build(); 

    Job job = jobBuilderFactory.get("testJob") 
      .start(echo("init")) 
      .next(subFlowStep1) 
      .next(echo("middle")) 
      .next(subFlowStep2) 
      .next(echo("last")) 
      .preventRestart().build(); 

    job.execute(execution); 
    assertEquals(execution.getStatus(), BatchStatus.COMPLETED); 
    assertEquals(execution.getStepExecutions().size(), expectedSteps); 
}