2016-12-28 13 views
2

私はスプリングブートを使用しています。私は、これらのクラスを実装しましたバッチジョブを持っている:なぜスプリングブートバッチジョブは1回だけ実行されていますか?

私の主なクラスがある:

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

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

} 

私のスケジューラは、次のとおりです。

@Component 
@EnableScheduling 
public class JobScheduler { 

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

と私の一括設定クラスです:

@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; 
    } ... 

今、私の問題は:

スケジューラの作品と、それは10秒ごとに繰り返され、 が、ジョブが唯一のアプリケーションの起動時に実行される(リーダー、プロセッサと作家ばかりのスタートアップに一度実行)、

SpringApplication.run(MyBatchConfig.class); 

が再には影響しないと思われますジョブを実行している。

どうすればよいですか?あなたはJobLauncher Beanを作成して、新しいジョブのインスタンスを起動するためのスケジューラにそれを使用する必要があり、事前

+0

このようにSpring Bootを実行すると、ジョブが実行され、シャットダウンします。自分自身を再実行するスケジューラは、確かにあなたが望むことをするつもりはありません。 –

+0

私はWebで検索し、多くのチュートリアルではSpringApplication.run(MyBatchConfig.class)と言います。再実行されます。実際にはそうではありません。だから何をすべきか? –

答えて

3

これは私が考えることができるものである、

1.Youはapplication.propertiesでこのプロパティを置きます。

spring.batch.job.enabled=false

これは単にあなたの春の一括設定を初期化し、実際にジョブを開始しません。

2.あなたのコードでApplicationクラスのSpringブートバッチジョブ開始クラスに注釈@EnableSchedulingを入力します。

3.Remove @EnableScheduling注釈JobSchedulerクラスと呼び、その代わりSpringApplication.run(MyBatchConfig.class)を呼び出すrunJob()からjobLauncher.run(job, jobParameters)から。

JobLauncher & Jobコンテキストが既に初期化されているため、Beanはスケジューラクラスに自動配線できます。

希望すると助かります!

+0

Sabirに感謝、それは問題を解決しました。 –

+0

問題が解決したらうれしく思います。あなたの問題が解決すれば、私の答えを受け入れることができます。 –

0

感謝。バッチ・ジョブがmain方法からSpringApplication.run(...)の呼び出しによって自動的に起動しないよう

+0

luboskrnac、 –

+0

に感謝します。しかし、これは例外が発生します。なぜなら、すでに@EnableBatchProcessingによってスケジュールされたジョブがあるからです。 –

関連する問題