2016-12-28 206 views
0

私はSpring Batchを使ってSpring Bootを使って開発しています。Springバッチジョブを特定の順序(Spring Boot)で実行する方法は?

私はSpring Bootが提供する最小限の設定で、いくつかのジョブを定義しました(XML構成はまったくありません)。しかし、アプリケーションを実行すると、ジョブは任意の順序で順番に実行されます。

私は@Configuration注釈付きクラス内のジョブをこのように定義しています、春は残りを行います。

@Bean 
public Job requestTickets() { 
    return jobBuilderFactory.get(Config.JOB_REQUEST_TICKETS) 
      .start(stepRequestTickets()) 
      .build(); 
} 

はどのようにして、特定の順序でジョブを実行するためのフレームワークを指示することができますか?

編集:この警告はヒントを与えることができますか? (おそらく何もない)

2016-12-29 17:45:33.320 WARN 3528 --- [main] o.s.b.c.c.a.DefaultBatchConfigurer: No datasource was provided...using a Map based JobRepository 
+0

複数のステップまたは複数のジョブで1つのジョブがありますか?あなたの仕事は1つだけです。あなたは、**雇用**と言うときに**ステップ**を意味しますか? 'stepRequestTickets()'のコードを表示します。 –

+0

私は複数の仕事をしています。私は一定の順序でジョブを順番に実行したいが、ジョブを注文する方法は見つけられない。これは、私がどのようにジョブを定義するかの単なるスニペットです。 –

答えて

2

1.Youである - と仮定しApplicationContext ctx = SpringApplication.run(SpringBatchMain.class, args);メインクラスの名前はSpringBatchMain.javaです。

これは、ジョブを開始せずにコンテキストを初期化します。

あなたが行うことができ、コンテキストが初期化され3.Once、どちらか - JobLauncher jobLauncher = (JobLauncher) ctx.getBean("jobLauncher");またはメインクラスでこのJobLauncher BeanのAutowiredを行うと、jobLauncher.run(job, jobParameters)を呼び出すことによって、特定の順序で順次、特定のジョブを起動します。

あなたはいつもそこにあなたの仕事を入れて、そのコレクションを反復処理でジョブを起動するために任意の順序付きコレクションを使用することができ、ステップ#2

で初期化されたコンテキストから特定のjobのインスタンスを取得することができます。

4。この上のテクニックは、JobLauncherが同期するように構成されている限り、すなわちメインスレッドがjobLauncher.run()呼び出しを完了するまで待っていれば動作します。これはjobLauncherのデフォルトの動作です。

asyncTaskExecutorを使用するようにjobLauncherを定義した場合、ジョブは並行して開始され、順番付けは維持されません。

希望すると助かります!

EDIT:ステファン・ニコルで指示し、唯一の仕事の順序付きコレクションを作成するには、あなたが反復処理し、そのためには、ジョブを起動することができることを助けるように見えるよう

は私が@Order注釈で実験されました。

コンポーネントの下にこれは、指定された順序で私に仕事を与える

@Component 
public class MyJobs { 
    @Autowired 
    private List<Job> jobs; 

    public List<Job> getJobs() { 
     return jobs; 
    } 
} 

と私は行うことができ、メインクラスでMyJobs myJobs = (MyJobs) ctx.getBean("myJobs");は、Beanが定義されて、

@Bean 
    public MyJobs myJobs() { 
     return new MyJobs(); 
    } 

私はmyJobsを反復処理すると、ジョブを起動することができます@Orderアノテーションで指定された順番で

+0

それはうまくいった!しかし、余分なQ: '@ Bean'コードはどこに置いていますか?私が 'main'メソッドに置くとうまく動作します。しかし、私が '@ Component'の中に置くと、私はSpringのエラーが出ます:' BeanDefinitionStoreException:クラスパスリソース[.../MyJobs.class]で定義された 'myJobs'という名前のBean定義が無効です。同じbean定義 ' –

+0

私は' @ Bean'定義が必要でないことを知りました。私は '@ Component'が既に必要なBeanを作成していると思います。 –

+0

あなたがあまりにも多くの仕事をしていて、それを管理するのが難しいならば、あなたは秩序と一緒に行く必要があります。 1つまたは2つのジョブの場合は、Order注釈を使用せずに手動でジョブを起動するだけです。 –

1

を注文する。

@Bean 
@Order(42) 
public Job requestTickets() { 
    return jobBuilderFactory.get(Config.JOB_REQUEST_TICKETS) 
      .start(stepRequestTickets()) 
      .build(); 
} 

詳しくはを参照してください。

+0

'@ Order'は機能しませんでした。 3つのジョブに '@Order(1)'、 '@Order(2)'、 '@Order(3)'を使ってアノテーションを挿入しましたが、前と同じように実行されます。 –

+0

あなたはジョブランチャーを使用していません。または、非常に古いSpring Bootバージョンを使用しています。 –

+0

@StephaneNic​​oll:あなたは**あなたが仕事のランチャーを使用していないことを意味します**。 'jobLauncher.run(job、jobParameters)'は特定のジョブを実行します。 @Orderもテストしましたが、あなたの答えに記述されているように動作していません。私はSpring Boot 1.4.0を使用しています。 OPにも更新があるかどうか分かりませんか? –

0

1つのジョブが2番目のジョブなどに依存する場合は、次のようにします。

@Configuration 
@EnableBatchProcessing 
@Import(DataSourceConfiguration.class) 
public class AppConfig { 

    @Autowired 
    private JobBuilderFactory jobs; 

    @Autowired 
    private StepBuilderFactory steps; 

    @Bean 
    public Job job(@Qualifier("step1") Step step1, @Qualifier("step2") Step step2) { 
     return jobs.get("myJob").start(step1).next(step2).build(); 
    } 

    @Bean 
    protected Step step1(ItemReader<Person> reader, ItemProcessor<Person, Person> processor, ItemWriter<Person> writer) { 
     return steps.get("step1") 
      .<Person, Person> chunk(10) 
      .reader(reader) 
      .processor(processor) 
      .writer(writer) 
      .build(); 
    } 

    @Bean 
    protected Step step2(Tasklet tasklet) { 
     return steps.get("step2") 
      .tasklet(tasklet) 
      .build(); 
    } 
} 
+0

私はあなたが注文のステップを話していると思いますが、私はJOBSを特定の'Job_n'は' Job_n-1'に依存しています。 –

0

コメントするのに十分な担当者がいません。しかし、あなたはあなたが望む順番であなたの仕事を手作業で起動しようとしましたか?

application.propertiesにspring.batch.job.enabled = falseを設定して、ジョブが自動的に実行されないようにする必要があります。

その後、ランチャーを使って必要な順番でジョブを起動してください。ここで

@RunWith(SpringRunner.class) 
@SpringBootTest(classes = { TestConfiguration.class, TestDataSourceConfiguration.class, TestBatchConfig.class }) 
public class JobOrderTest { 

    @Autowired 
    JobLauncher jobLauncher; 

    @Mock 
    Job firstJob; 

    @Mock 
    Job secondJob; 

    @Mock 
    Job thirdJob; 

    @Mock 
    JobParametersValidator jobParametersValidator; 

    @Test 
    public void jobInOrderTest() throws JobExecutionAlreadyRunningException, JobRestartException, JobInstanceAlreadyCompleteException, JobParametersInvalidException { 

     when(firstJob.getName()).thenReturn(UUID.randomUUID().toString()); 
     when(secondJob.getName()).thenReturn(UUID.randomUUID().toString()); 
     when(thirdJob.getName()).thenReturn(UUID.randomUUID().toString()); 
     when(firstJob.getJobParametersValidator()).thenReturn(jobParametersValidator); 
     when(secondJob.getJobParametersValidator()).thenReturn(jobParametersValidator); 
     when(thirdJob.getJobParametersValidator()).thenReturn(jobParametersValidator); 

     jobLauncher.run(firstJob, new JobParameters()); 
     jobLauncher.run(secondJob, new JobParameters()); 
     jobLauncher.run(thirdJob, new JobParameters()); 
    } 

} 

が行う、最初 spring.batch.job.enabled=false でapplication.properties

2.Inあなたのメインクラスを指定することにより、ジョブの自動開始を無効に出力

2016-12-30 09:48:36.457 INFO 144860 --- [cTaskExecutor-1] o.s.b.c.l.support.SimpleJobLauncher  : Job: [firstJob] launched with the following parameters: ... 
2016-12-30 09:48:36.457 INFO 144860 --- [cTaskExecutor-1] o.s.b.c.l.support.SimpleJobLauncher  : Job: [firstJob] completed with the following parameters: ... 
2016-12-30 09:48:36.478 INFO 144860 --- [cTaskExecutor-2] o.s.b.c.l.support.SimpleJobLauncher  : Job: [secondJob] launched with the following parameters: ... 
2016-12-30 09:48:36.478 INFO 144860 --- [cTaskExecutor-2] o.s.b.c.l.support.SimpleJobLauncher  : Job: [secondJob] completed with the following parameters: ... 
2016-12-30 09:48:36.508 INFO 144860 --- [cTaskExecutor-3] o.s.b.c.l.support.SimpleJobLauncher  : Job: [thirdJob] launched with the following parameters: ... 
2016-12-30 09:48:36.508 INFO 144860 --- [cTaskExecutor-3] o.s.b.c.l.support.SimpleJobLauncher  : Job: [thirdJob] completed with the following parameters: ... 
関連する問題