Exemple Spring Batch + Quartz Scheduler

Exemple de programme Spring Batch + Quartz

Dans ce didacticiel, nous allons vous montrer comment utiliser le framework de planification Quartz pour planifier une tâche batch Spring à exécuter toutes les 10 secondes.

Outils et bibliothèques utilisés

  1. Maven 3

  2. Eclipse 4.2

  3. JDK 1.6

  4. Spring Core 3.2.2.RELEASE

  5. Spring Batch 2.2.0.RELEASE

  6. Quartz 1.8.6

La relation ressemble à ceci:

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

LeQuartzJobBean agit comme un pont entre les cadres Spring batch et Quartz.

1. Dépendances du projet

Spring a besoin despring-context-support pour prendre en charge le planificateur Quartz.

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. Emplois Spring Batch

Un travail par lots pour lire un fichier csv et imprimer le contenu via un rédacteur personnalisé. Quelques points à souligner:

1. Configurez le beanJobRegistryBeanPostProcessor, il enregistre les beansJob avecJobRegistry, de sorte queQuartzJobBean puisse obtenir le beanJob viaJobRegister (JobLocator ).
2. LeJobLauncherDetails est étenduQuartzJobBean, agit comme un pont entre Spring batch et Quartz.

job-quartz.xml



  
  
    
  

  

  
    
  

  
    
  

  
  

  

  

  
    
      
        
        
      
    
  

  

    
    

    
      
        
          
            
          
        
        
          
            
          
        
      
    

  

  
  
    
      
        
        
      
    
  

  
    
    
    
      
        
        
        
        
        
      
    
  

3. Exemple QuartzJobBean

Cette classe est copiée à partir deSpring batch sample Github repository, avec des modifications mineures pour exécuter le travail terminé en passant unnew Date() à chaque fois que le travail est en cours d'exécution.

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. Exécuter

Charge le contexte de l'application Spring, le planificateur Quartz exécutera le "reportJob" toutes les 10 secondes.

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);

  }
}

Télécharger le code source

Téléchargez-le -SpringBatch-Quartz-Scheduler-Example.zip (20 ko)