2016-04-11 6 views
0

春のバッチでやり直す方法があるかどうか知っていますか? 条件が満たされるまで、最初にStep1、次にStep2、Step3、次にStep1、Step2、Step3などに戻ります。私はグーグルで試してみましたが、具体的な事例を見つけられませんでした。これまで春のバッチ - 最初のステップから再実行

コード:

@Bean 
Job job(JobBuilderFactory factory) { 
    return factory.get(JOB_NAME) 
      .start(stagingStep) 
      .next(analyzeStep) 
      .next(reportingStep) 

      .preventRestart() 
      .build(); 
} 
+0

をしたいのであれば、あなたは仕事になりたいです連続。あなたはタスクスケジューラを使用することができますか(spring3以降)、私はあなたがcronコマンドを操作するか、対応するメソッド内でトリガできると思います。そして、あなたはこのメソッドでトリガを止めるいくつかの条件を持つことができます。 – surya

+0

バッチは連続して実行されません。 ジョブがリスナーに定義をロードし、Step1,2,3が1つの定義を処理した後、Step1に戻って次の処理を実行します。 – LG87

答えて

1

は、私は、これは、複数の方法で行うことができると思います。..

1.Intercept言及here

<job id="footballJob"> 
<step id="playerload"   parent="s1" next="gameLoad"/> 
<step id="gameLoad"   parent="s2" next="playerSummarization"/> 
<step id="playerSummarization" parent="s3"/> 
<listeners> 
    <listener ref="sampleListener"/> 
</listeners> 

としての仕事。 とあなたのリスターを実装する..

2.Implement独自のトリガ/スケジューラ
public interface JobExecutionListener { 

void beforeJob(JobExecution jobExecution); 

void afterJob(JobExecution jobExecution); // implement and call the job again 
} 

...

<task:scheduled ref="runScheduler" method="run" trigger="mytrigger" />

<bean id="runScheduler" class="com.spring.scheduler.MyScheduler" > 
    <property name="jobLauncher" ref="jobLauncher" /> 
    <property name="job" ref="helloWorldJob" /> 
</bean> 

..

<task:scheduled-tasks> 
<!--task:scheduled ref="runScheduler" method="run" fixed-delay="5000" /> --> 

<task:scheduled ref="runScheduler" method="run" cron="*/5 * * * * *" /> 
</task:scheduled-tasks> 

あなたがあなた自身のトリガを使用し、上記への参照を渡すことができます...

<bean id="mytrigger" class="com.spring.scheduler.MyTrigger" /> 

public class MyScheduler { 

@Autowired 
private JobLauncher jobLauncher; 

@Autowired 
private Job job; 

public void run() { 
    try { 
     JobParameters param = new JobParametersBuilder().toJobParameters(); 
     String dateParam = new Date().toString(); 
     JobExecution execution = jobLauncher.run(job, param); 
     System.out.println("Exit Status in scheduler: " + execution.getStatus()); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

し、必要ならば、あなたは再び再び再実行する必要がありますタスクレット一つだけ3.Ifはトリガー

public class MyTrigger implements Trigger{ 
@Override 
public Date nextExecutionTime(TriggerContext triggerContext) {...return date;} 

を作成することができ、その簡単なだけ何度も何度もRepeatStatus.CONTINUABLE、このタスクの再実行を返します。.. 。

public RepeatStatus execute(StepContribution contribution, 
ChunkContext chunkContext)throws Exception 
{ 
    return RepeatStatus.CONTINUABLE;//RepeatStatus.FINISHED; 
} 

そして、あなたも行うことができますいくつかの特定の段階(ステップ1または2を操作して、再度実行しているjob..beforeを構築するために具体的な手順を使用します)

+0

返信いただきありがとうございますが、手順を実行するだけですか?ジョブにはリスナーがいくつかありますが、私は再実行したくありません。 – LG87

+0

私の答え(step3)が更新されました。助けてほしいと思っています。 – surya

+0

少し書き直してしまったので、代わりにバッチがジョブを再開できます。返信いただきありがとうございます:) repeatStatus thingyを使用して今すぐ – LG87

関連する問題