2016-10-14 3 views
0

スキップ限界が設定された単純なバッチプロセスがあります。スキップ限界を超えると、ジョブは失敗し、2段階には達しません。スキップ限度を超えた場合は、手順3に進んでください。春のバッチには、スキップ限界を超えた場合に実行を強制的に実行する方法があります。

<job id="jobA" incrementer="runIdIncrementer" > 
    <step id="step1" next="step2"> 
     <tasklet> 
      <chunk commit-interval="10" reader="dReader" writer="dWriter" skip-limit="100"> 
       <skippable-exception-classes> 
        <include class="java.lang.Exception"/> 
       </skippable-exception-classes> 
      </chunk> 
      <listeners> 
       <listener ref="skipListener"/> 
      </listeners> 
     </tasklet> 
    </step> 
    <step id="step2" next="step3"> 
     <tasklet> 
      <chunk commit-interval="10" reader="sReader" writer="sWriter"/> 
     </tasklet> 
    </step>  
    <step id="step3"> 
     <tasklet ref="cleanUpStep"/> 
    </step> 
</job> 

これを行う方法はありますか?私は "next"を設定しようとしましたが、次の属性とトランジション要素がないというエラーがスローされます。

助けがあれば助かります。

+0

skip-limitはLimitCheckingItemSkipPolicyでバインドされます。おそらく、あなたはSkipLimitExceededExceptionを傍受して抑制するカスタムのものを注入しようとする可能性があります。 –

+1

http://docs.spring.io/spring-batch/reference/html/configureStep.html#conditionalFlow?正確にスローされたエラーは何ですか? – Asoub

+0

@ LucaBassoRicciありがとう、私はそれを試みます。 Asoubはい私はそれを次のように試みたが、ポストに記載されているエラーを持っていた "次の属性とトランジション要素がない" – sadWal

答えて

0

私は「次へ」を使って修正することができました。ステップ宣言に next="step2"を設定して次の属性を含めていました。これをここから削除し、次の属性を追加することができました。

<step id="step1"> 
    <tasklet> 
     <chunk commit-interval="10" reader="dReader" writer="dWriter" skip-limit="100"> 
      <skippable-exception-classes> 
       <include class="java.lang.Exception"/> 
      </skippable-exception-classes> 
     </chunk> 
     <listeners> 
      <listener ref="skipListener"/> 
     </listeners> 
    </tasklet> 
<next on="*" to="step2" /> 
</step> 

上記のコードは、スキップ限度に達してもステップ2に進みます。 <step id="step1" next="step2">は、制限に達した場合にジョブが失敗する原因になります。

0

手順にStepExecutionListenerを追加できます。ステップが失敗してもafterStep(StepExecution stepExecution)が実行されます。この方法では、ステップの終了ステータスを取得し、それを変更することができます:stepExecution.setExitStatus(ExitStatus.COMPLETED)

エラーがスキップ制限を超過しているかどうかを確認するには、stepExecution.getFailureExceptions()とし、SkipLimitExceededException(またはそのようなもの)を検索します。スキップされたアイテムの数を取得して最大値と比較することもできます(ただし、100のスキップでErrorの場合は、別の操作を行う必要があります)。

注:あまりにも多く例外は良いデザインのようには聞こえませんが、あなたが何をしているのか分かっている限り...

+0

あなたの応答に感謝します。私はこれを試しましたが、ジョブはまだ失敗し、スキップ限界に達すると他のステップに進むことはありません。 – sadWal