2016-04-11 4 views
0

Weiß jemand, ob es einen Weg gibt, im Spring-Batch neu zu beginnen? Ich möchte, dass es zuerst bei Schritt1 beginnt, dann bei Schritt2, Schritt3, dann zurück zu Schritt1, Schritt2, Schritt3 und so weiter, bis eine Bedingung erfüllt ist. Ich habe versucht zu googeln, konnte aber keine konkreten Beispiele finden.Spring batch - Läuft vom ersten Schritt

-Code bisher:

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

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

So wollen Sie den Job zu sein kontinuierlich. Kannst du den Task-Scheduler verwenden (spring3 weiter) und ich denke, du kannst Cron-Befehle manipulieren oder du kannst innerhalb der entsprechenden Methode triggern..und du kannst eine Bedingung haben, um das Triggern in dieser Methode zu stoppen. – surya

+0

Die Charge wird nicht kontinuierlich ausgeführt. Der Job lädt einige Definitionen in einem Listener, und Step1, 2 und 3 verarbeitet eine Definition, dann sollte es zurück zu Step1 gehen und die nächste – LG87

Antwort

1

Ich denke, das in vielfältiger Weise getan werden kann ..

1.Intercept der Job wie erwähnt 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> 

. und implementieren Sie Ihren Lister ..

public interface JobExecutionListener { 

void beforeJob(JobExecution jobExecution); 

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

2.Umsetzung Ihre eigenen Trigger/Scheduler ...

<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> 

Sie können über Ihre eigenen Trigger und übergeben Referenz verwenden ...

<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(); 
    } 
} 

und dann erforderlich, wenn Sie einen Trigger

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

3.Falls nur schaffen kann man Tasklet wieder wieder erneut ausgeführt werden muss, ist es einfach, nur zurückkehren RepeatStatus.CONTINUABLE, diese Aufgabe immer wieder erneut ausführen ..

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

und wenn Sie einigen konkreten Schritt mögen, die auch getan werden kann (manipulieren Schritt 1 oder 2 und konkrete Schritte verwenden, um eine job..before zu bauen wieder zum laufen)

+0

Danke für Ihre Antwort, aber wäre es möglich, nur die Schritte auszuführen? Der Job hat einige Zuhörer, die ich nicht wiederholen möchte. – LG87

+0

Ich aktualisierte meine Antwort (Schritt3), hoffe, es hilft – surya

+0

Ich endete, um ein bisschen umzuschreiben, so dass der Stapel stattdessen den Job neu starten kann. Danke für die Antwort :) Mit repeatStatus dingy jetzt – LG87