Spring Batch Quarz Scheduler-Beispiel

Beispiel für Spring Batch + Quartz Scheduler

In diesem Tutorial zeigen wir Ihnen, wie Sie mit dem Quartz-Scheduler-Framework einen Spring-Batch-Job so planen, dass er alle 10 Sekunden ausgeführt wird.

Verwendete Tools und Bibliotheken

  1. Maven 3

  2. Eclipse 4.2

  3. JDK 1.6

  4. Federkern 3.2.2.FREIGABE

  5. Spring Batch 2.2.0.RELEASE

  6. Quarz 1.8.6

Die Beziehung sieht folgendermaßen aus:

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

DasQuartzJobBean wirkt wie eine Brücke zwischen Spring Batch- und Quarzgerüsten.

1. Projektabhängigkeiten

Spring benötigtspring-context-support, um den Quartz Scheduler zu unterstützen.

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

Ein Stapeljob zum Lesen einer CSV-Datei und Drucken des Inhalts über einen benutzerdefinierten Writer. Einige Punkte zum Hervorheben:

1. Konfigurieren Sie die BeanJobRegistryBeanPostProcessor, sie registriert die BohnenJobmitJobRegistry, sodassQuartzJobBean die BeanJob überJobRegister (JobLocator) abrufen kann ).
2. DasJobLauncherDetails ist verlängertQuartzJobBean, fungiert als Brücke zwischen Spring Batch und Quarz.

job-quartz.xml



  
  
    
  

  

  
    
  

  
    
  

  
  

  

  

  
    
      
        
        
      
    
  

  

    
    

    
      
        
          
            
          
        
        
          
            
          
        
      
    

  

  
  
    
      
        
        
      
    
  

  
    
    
    
      
        
        
        
        
        
      
    
  

3. QuartzJobBean Beispiel

Diese Klasse wird vonSpring batch sample Github repository kopiert, wobei geringfügige Änderungen vorgenommen werden, um den abgeschlossenen Job auszuführen, indem bei jeder Ausführung des Jobs einnew Date() übergeben wird.

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. Starte es

Lädt den Spring-Anwendungskontext, führt der Quartz-Scheduler den "reportJob" alle 10 Sekunden aus.

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

  }
}

Quellcode herunterladen

Laden Sie es herunter -SpringBatch-Quartz-Scheduler-Example.zip (20 kb)