Springバッチ+クォーツスケジューラの例

Spring Batch + Quartz Schedulerの例

このチュートリアルでは、Quartzスケジューラフレームワークを使用して、10秒ごとに実行されるSpringバッチジョブをスケジュールする方法を示します。

使用するツールとライブラリ

  1. メーベン3

  2. Eclipse 4.2

  3. JDK 1.6

  4. Spring Core 3.2.2.RELEASE

  5. Spring Batch 2.2.0.RELEASE

  6. クォーツ1.8.6

関係は次のようになります。

Spring Batch <--> Spring QuartzJobBean <--> Quartz Frameworks

QuartzJobBeanは、SpringバッチとQuartzフレームワークの間のブリッジのように機能します。

1. プロジェクトの依存関係

Springは、Quartzスケジューラをサポートするためにspring-context-supportを必要とします。

pom.xml


    1.6
    3.2.2.RELEASE
    2.2.0.RELEASE
    1.8.6
  

  

    
    
        org.springframework
        spring-core
        ${spring.version}
    

    
    
        org.springframework
        spring-context-support
        ${spring.version}
    

    
    
        org.quartz-scheduler
        quartz
        ${quartz.version}
    

    
    
        org.springframework.batch
        spring-batch-core
        ${spring.batch.version}
    
    
        org.springframework.batch
        spring-batch-infrastructure
        ${spring.batch.version}
    

  

2. 春のバッチジョブ

csvファイルを読み取り、カスタムライターを介してコンテンツを印刷するバッチジョブ。 ハイライトするポイントはほとんどありません:

1. JobRegistryBeanPostProcessor Beanを構成します。JobBeanをJobRegistryに登録し、QuartzJobBeanJobRegister(JobLocator)を介してJobBeanを取得できるようにします。 )。
2。 JobLauncherDetailsは拡張されたQuartzJobBeanであり、SpringバッチとQuartzの間のブリッジとして機能します。

job-quartz.xml



  
  
    
  

  

  
    
  

  
    
  

  
  

  

  

  
    
      
        
        
      
    
  

  

    
    

    
      
        
          
            
          
        
        
          
            
          
        
      
    

  

  
  
    
      
        
        
      
    
  

  
    
    
    
      
        
        
        
        
        
      
    
  

3. QuartzJobBeanの例

このクラスはSpring batch sample Github repositoryからコピーされますが、ジョブが実行されるたびにnew Date()を渡すことにより、完了したジョブを実行するための小さな変更が加えられています。

JobLauncherDetails.java

package com.example.quartz;

import java.util.Date;
import java.util.Map;
import java.util.Map.Entry;

import org.quartz.JobExecutionContext;
import org.springframework.batch.core.JobExecutionException;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.JobParametersBuilder;
import org.springframework.batch.core.configuration.JobLocator;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.scheduling.quartz.QuartzJobBean;

public class JobLauncherDetails extends QuartzJobBean {

  static final String JOB_NAME = "jobName";

  private JobLocator jobLocator;

  private JobLauncher jobLauncher;

  public void setJobLocator(JobLocator jobLocator) {
    this.jobLocator = jobLocator;
  }

  public void setJobLauncher(JobLauncher jobLauncher) {
    this.jobLauncher = jobLauncher;
  }

  @SuppressWarnings("unchecked")
  protected void executeInternal(JobExecutionContext context) {

    Map jobDataMap = context.getMergedJobDataMap();

    String jobName = (String) jobDataMap.get(JOB_NAME);

    JobParameters jobParameters = getJobParametersFromJobMap(jobDataMap);

    try {
        jobLauncher.run(jobLocator.getJob(jobName), jobParameters);
    } catch (JobExecutionException e) {
        e.printStackTrace();
    }
  }

  //get params from jobDataAsMap property, job-quartz.xml
  private JobParameters getJobParametersFromJobMap(Map jobDataMap) {

    JobParametersBuilder builder = new JobParametersBuilder();

    for (Entry entry : jobDataMap.entrySet()) {
        String key = entry.getKey();
        Object value = entry.getValue();
        if (value instanceof String && !key.equals(JOB_NAME)) {
            builder.addString(key, (String) value);
        } else if (value instanceof Float || value instanceof Double) {
            builder.addDouble(key, ((Number) value).doubleValue());
        } else if (value instanceof Integer || value instanceof Long) {
            builder.addLong(key, ((Number) value).longValue());
        } else if (value instanceof Date) {
            builder.addDate(key, (Date) value);
        } else {
            // JobDataMap contains values which are not job parameters
            // (ignoring)
        }
    }

    //need unique job parameter to rerun the completed job
    builder.addDate("run date", new Date());

    return builder.toJobParameters();

  }

}

4. それを実行します

Springアプリケーションコンテキストをロードすると、Quartzスケジューラは10秒ごとに「reportJob」を実行します。

App.java

package com.example;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {

  public static void main(String[] args) {

    String springConfig = "spring/batch/jobs/job-quartz.xml";

    ApplicationContext context = new ClassPathXmlApplicationContext(springConfig);

  }
}

ソースコードをダウンロード

ダウンロード–SpringBatch-Quartz-Scheduler-Example.zip(20 kb)