2016-09-08 1 views
0

Probieren Spring Batch mit Java-basierten Deklaration statt für JobBuilderFactory und Flow zur direkten Zustand Schrittausführung. Ich habe am Ende von 'step2()' einen Schritt-Ausführungs-Listener, der einen benutzerdefinierten Beendigungscode zurückgibt, der dazu verwendet wird, den entsprechenden Schritt danach auszuwählen.Spring Batch jobBuilderFactory mit Flow 'on'

Das unerwartete Verhalten, das ich erhalte, ist, dass der Jobstatus als "FAILED" endet, es sei denn, ich definiere ausdrücklich die Bedingung für den 'COMPLETED' ExitStatus ExitCode. Der Code scheint ansonsten wie erwartet ausgeführt zu werden. Die Fälle sind unten aufgeführt.

Ich sehe, dass die hier beteiligten Klassen JobBuilder und FlowBuilder sind.

Fragen:

1) Warum in Job 2A und 2B Ergebnis Fälle tun 'nicht bestanden'?

2) Was ist das XML-Äquivalent der folgenden, wenn es hilft zu klären, was vor sich geht?

// 1. JOB STATUS ends up as COMPLETED 
jobBuilderFactory.get("myProcess") 
.flow(step1()) 
.next(step2()) 
.on(ExitStatus.COMPLETED.getExitCode()) 
.end() 
.on("CUSTOM_EXIT_CODE") 
.to(step3()) 
.end() 
.build(); 

// 2A. JOB STATUS ends up as FAILED 
jobBuilderFactory.get("myProcess") 
.flow(step1()) 
.next(step2()) 
.on("CUSTOM_EXIT_CODE") 
.to(step3()) 
.on(ExitStatus.COMPLETED.getExitCode()) 
.end() 
.end() 
.build(); 

// 2B. JOB STATUS ends up as FAILED 
jobBuilderFactory.get("myProcess") 
.flow(step1()) 
.next(step2()) 
.on("CUSTOM_EXIT_CODE") 
.to(step3()) 
.end() 
.build(); 

Antwort

0

Standardmäßig werden alle Schritte ExitStatus.COMPLETED zurückgeben. Wenn Sie einen benutzerdefinierten Code zurückkehren wollen, dann sollten Sie Ihren Schritt explizit zurückgeben FlowExecutionStatus wie

return new FlowExecutionStatus("CUSTOM_EXIT_CODE"); 

Wenn es nicht übereinstimmt, dann wird es zu fehlerhaftem Status gehen.

Wenn Sie die XML-Konfiguration möchten Sie so tun können, als here

<batch:job id="conditionalJob"> 
     <batch:step id="stepOne" next="decision"> 
      <batch:tasklet ref="stepOneTasklet"></batch:tasklet> 
     </batch:step> 
     <batch:decision decider="decider" id="decision"> 
      <batch:next on="Step2" to="stepTwo"/> 
      <batch:next on="Step3" to="stepThree"/> 
     </batch:decision> 
     <batch:step id="stepTwo"> 
      <batch:tasklet ref="stepTwoTasklet"></batch:tasklet> 
     </batch:step> 
     <batch:step id="stepThree"> 
      <batch:tasklet ref="stepThreeTasklet"></batch:tasklet> 
     </batch:step> 
    </batch:job> 

Eine weitere Konfiguration I

<batch:job id="processorJob"> 
     <batch:step id="setUpParams"> 
      <batch:tasklet ref="setUpParamsTasklet"></batch:tasklet> 
      <batch:next on="*" to="jobFlowDecider"/> 
      <batch:next on="FAILED" to="jobFailed"/> 
     </batch:step> 

     <batch:decision decider="jobExecutionDecider" id="jobFlowDecider"> 
      <batch:next on="PROJECT_NOT_EXIST" to="createProject"/> 
      <batch:next on="MODEL_NOT_EXIST" to="createModel"/> 
      <batch:next on="MODEL_EXIST" to="importModel"/> 
     </batch:decision> 

     <batch:step id="createProject"> 
      <batch:tasklet ref="createProjectTasklet"></batch:tasklet> 
      <batch:next on="*" to="createModel"/> 
      <batch:next on="FAILED" to="jobFailed"/> 
     </batch:step> 
<batch:step id="updateRevision"> 
      <batch:tasklet ref="updateRevisonTasklet"></batch:tasklet> 
      <batch:end on="COMPLETED"/> 
      <batch:next on="FAILED" to="jobFailed"/>   
     </batch:step> 
     <batch:step id="jobFailed"> 
      <batch:tasklet ref="jobFailedTasklet"></batch:tasklet>   
     </batch:step> 
    </batch:job> 
hat gezeigt
+0

Ist es gelöst? –

+0

Ich musste nicht wissen, wie man einen benutzerdefinierten Code für den FlowExecutionStatus zurückgibt. Ich denke, dass das XML hier hilfreich ist, um mit dem, was ich getan habe, zu vergleichen, aber ich verstehe immer noch nicht, warum der Jobstatus als "FAILED" endet. Danke dafür. –

Verwandte Themen