0

に複数のジョブを実行している私は春のバッチに新しいですし、これを実行する方法を見つけ出すことができませんでした。..春のバッチ - 並列

基本的に私が付いたファイルを探すために、すべてのN分を実行スプリングファイルポーラーを持っています特定のディレクトリにいくつかの名前(例:A.txt & B.txt)いつでも、このディレクトリに最大2つのファイル(AとB)が存在する可能性があります。 Spring Batch Jobを介して、これらの2つのファイルは処理され、2つの異なるDBテーブルに保存されます。

これらのファイルは多少類似しているため、同じプロセッサ/ライターが使用されています。

今私が設定した方法では、すべてのポーリングサイクル1のファイルが取得され、ジョブが実行されます。

ディレクトリに2つのファイル(A.txtとB.txt)があるとします。両方のジョブを同時に実行できるように2つのジョブを作成する方法はありますか?

答えて

2

私はあなたができると信じています。あなたが春のバッチで新しい(私のような)ので、私はあなたがまだ行っていない場合はthe domain language of a batchを通過することをお勧めします。

次に、独自のを非同期JobLauncherと設定して開始することができます。たとえば:

@Bean 
    public JobLauncher jobLauncher() throws Exception 
    { 
    SimpleJobLauncher jobLauncher = new SimpleJobLauncher(); 

    jobLauncher.setJobRepository(jobRepository); 
    jobLauncher.setTaskExecutor(new SimpleAsyncTaskExecutor()); 
    jobLauncher.afterPropertiesSet(); 

    return jobLauncher; 
    } 

SimpleAsyncTaskExecutorに特別な注意を払ってください(ジョブレポはautowiredすることができます)。次の可視化としてこの構成は、非同期実行できるようになります:

Asynchronous

は同期実行の流れとそれを比較:

enter image description here

多分それはさらにSimpleJobLauncher Javaのドキュメントを引用するのに役立つでしょう:

シンプルな実装JobLauncherインターフェースの実装Spring Core TaskExecutorインターフェイスは、ジョブの起動に使用されます。これは、 タイプのエグゼキュータセットが非常に重要であることを意味します。 SyncTaskExecutorが使用されている場合、 ジョブは ランチャーを呼び出した同じスレッド内で処理されます。このクラスのユーザー がTaskExecutor の実装が同期または非同期にタスクを開始するかどうかを完全に理解できるように注意する必要があります。デフォルトの 設定では、同期タスク実行プログラムが使用されます。

詳細および設定オプション - here

最後に、の異なるという名前のジョブを作成したり、異なるパラメータセットで起動したりするだけです。ナイーブな例は次のようになります。あなたの非同期ジョブランチャーでこれらのジョブを実行する

@Autowired 
    public JobBuilderFactory jobBuilderFactory; 

    public Job createJobA() { 
    return jobBuilderFactory.get("A.txt") 
          .incrementer(new RunIdIncrementer()) 
          .flow(step1()) 
          .next(step2()) 
          .end() 
          .build(); 
    } 

    public Job createJobB() { 
    return jobBuilderFactory.get("B.txt") 
          .incrementer(new RunIdIncrementer()) 
          .flow(step1()) 
          .next(step2()) 
          .end() 
          .build(); 
    } 

は、並列に実行される2つのジョブインスタンスを作成します。これは単なる選択肢に過ぎず、あなたの状況に適しているかもしれません。

3

Springを使用して非同期モードでジョブを実行するには、非常に良い方法がありますが、それはちょうどJobLauncherの設定方法の問題です。 JobLauncherにはtaskExecutorのプロパティがあり、そのプロパティに割り当てられている実装に応じて非同期実行をアクティブ化できます。

Springが提供できるすべてのTaskExecutorタイプがあります。必要に応じて、バッチ非同期ジョブを実行する最適な方法を選択してください。 Task Executors Types in Spring

たとえば、SimpleAsyncTaskExecutorは、すべての呼び出しで新しいThreadを作成し、実行頻度が高い場合にパフォーマンスの問題を引き起こす可能性があるタスク実行者です。一方、リソースを再利用し、システムの効率を最大化するために、プール機能を提供するTaskExecutorsタイプもあります。ここで

ThreadPoolTaskExecutorを設定する方法の小さな例です。

A)を構成ThreadPoolTask​​Executor豆

@Bean 
    public ThreadPoolTaskExecutor taskExecutor() { 
    ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); 
    taskExecutor.setCorePoolSize(15); 
    taskExecutor.setMaxPoolSize(20); 
    taskExecutor.setQueueCapacity(30); 
    return taskExecutor; 
} 

B)を構成JobLauncher豆

@Bean 
    public JobLauncher jobLauncher(ThreadPoolTaskExecutor taskExecutor, JobRepository jobRepository){ 
     SimpleJobLauncher jobLauncher = new SimpleJobLauncher(); 
     jobLauncher.setTaskExecutor(taskExecutor); 
     jobLauncher.setJobRepository(jobRepository); 
     return jobLauncher; 
    } 

C)あなたのJobLauncherとあなたを注入しますJobs構成

@Autowired 
private JobLauncher jobLauncher; 

@Autowired 
@Qualifier("job1-file-A") 
private Job job1; 

@Autowired 
@Qualifier("job2-file-B") 
private Job job2; 

D)最後に、あなたのSpringBootクラス@EnableBatchProcessing@EnableScheduling

@EnableBatchProcessing 
@EnableScheduling 
@SpringBootApplication 
public class MyBatchApp { 
にジョブ

@Scheduled(cron = "*/1 * * * * *") 
public void run1(){ 
    Map<String, JobParameter> confMap = new HashMap<>(); 
    confMap.put("time", new JobParameter(System.currentTimeMillis())); 
    JobParameters jobParameters = new JobParameters(confMap); 
    try { 
     jobLauncher.run(job1, jobParameters); 
    }catch (Exception ex){ 
     logger.error(ex.getMessage()); 
    } 

} 

@Scheduled(cron = "*/1 * * * * *") 
public void run2(){ 
    Map<String, JobParameter> confMap = new HashMap<>(); 
    confMap.put("time", new JobParameter(System.currentTimeMillis())); 
    JobParameters jobParameters = new JobParameters(confMap); 
    try { 
     jobLauncher.run(job2, jobParameters); 
    }catch (Exception ex){ 
     logger.error(ex.getMessage()); 
    } 

} 

E)のスケジュール

関連する問題