2016-12-28 1 views
2

Ich benutze Springboot. Ich habe einen Batch-Job, den ich mit diesen Klassen implementiert haben:Warum Spring Boot Batch-Job nur einmal ausgeführt wird?

Meine Hauptklasse ist:

@SpringBootApplication 
@ComponentScan("com.batch") 
@PropertySource("classpath:application.properties") 
public class Application { 

    public static void main(String[] args) { 
     SpringApplication.run(Application.class); 
    } 

} 

Mein Scheduler ist:

@Component 
@EnableScheduling 
public class JobScheduler { 

    @Scheduled(fixedRate = 10000) 
    public void runJob() { 
     SpringApplication.run(MyBatchConfig.class); 
    } 
} 

und meine Batch-Konfigurationsklasse ist:

@Configuration 
@EnableBatchProcessing 
public class MyBatchConfig { 

    @Value("${database.driver}") 
    private String databaseDriver; 
    @Value("${database.url}") 
    private String databaseUrl; 
    @Value("${database.username}") 
    private String databaseUsername; 
    @Value("${database.password}") 
    private String databasePassword; 

    @Bean 
    public Job myJob(JobBuilderFactory jobs, Step s) { 
     Job job = jobs.get("myJob") 
       .incrementer(new RunIdIncrementer()) 
       .flow(s) 
       .end() 
       .build(); 
     return job; 
    } 

    @Bean 
    public Step myStep(StepBuilderFactory stepBuilderFactory, ItemReader<Account> reader, 
         ItemWriter<Person> writer, ItemProcessor<Account, Person> processor) { 
     TaskletStep step = stepBuilderFactory.get("myStep") 
       .<Account, Person>chunk(1) 
       .reader(reader) 
       .processor(processor) 
       .writer(writer) 
       .build(); 
     step.setAllowStartIfComplete(true); 
     return step; 
    } ... 

jetzt ist mein Problem:

der Scheduler funktioniert und es wiederholt sich alle 10 Sekunden, aber der Job führt nur beim Anwendungsstart (Leser, Prozessor und Schriftsteller nur einmal in Start ausführt) und es scheint, dass

SpringApplication.run(MyBatchConfig.class); 

keine Auswirkung auf die Wieder- hat den Job ausführen.

was soll ich tun?

Vielen Dank im Voraus

+0

Laufender Spring Boot wie dieser wird den Job ausführen und herunterfahren. Der Scheduler, der sich selbst wiederholt, wird sicherlich nicht das tun, was Sie wollen. –

+0

Ich suchte im Web und viele Tutorials erwähnen, dass SpringApplication.run (MyBatchConfig.class); wird dazu führen, dass es erneut ausgeführt wird. aber in der Tat nicht. also was soll ich tun? –

Antwort

3

ist, was ich denken kann,

1.You setzen diese Eigenschaft in application.properties so Ihre Batch-Job durch Aufruf von SpringApplication.run(...) von main Methode nicht automatisch gestartet wird. Diese

spring.batch.job.enabled=false

einfach Ihre Spring Batch-Konfiguration initialisieren und nicht wirklich Job starten.

2.Put Annotation @EnableScheduling auf Ihrer Spring Boot Batch-Job-Start Klasse, z. B. auf Application Klasse in Ihrem Code.

3.Remove @EnableScheduling Anmerkung aus JobScheduler Klasse und Anruf, jobLauncher.run(job, jobParameters) von runJob() statt SpringApplication.run(MyBatchConfig.class) aufzurufen.

JobLauncher & Job Bohnen können automatisch per Kabel an Ihren Scheduler-Klasse sein, da Kontext bereits initialisiert.

Hoffe es hilft !!

+0

danke Sabir, es hat das Problem gelöst. –

+0

Froh, dass das Problem gelöst ist, können Sie meine Antwort akzeptieren, wenn das Ihr Problem gelöst hat. –

0

Sie benötigen JobLauncher Bohne zu schaffen, und dass für den Start neuer Job-Instanzen in Scheduler verwenden. Diese

+0

danke luboskrnac, –

+0

danke luboskrnac, aber dies wird eine Ausnahme auslösen, weil bereits ein Job von @EnableBatchProcessing geplant ist. –

Verwandte Themen