JAX 2013 Enterprise Java Batch mit Spring · java...

48
Dennis Schulte / Tobias Flohre | codecentric AG Enterprise Java Batch mit Spring

Transcript of JAX 2013 Enterprise Java Batch mit Spring · java...

Page 1: JAX 2013 Enterprise Java Batch mit Spring · java org.springframework.batch.core.launch.support.CommandLineJobRunner testJob.xml testJob date=2012/08/29 − Standalone, 1 JVM pro

Dennis Schulte / Tobias Flohre | codecentric AG

Enterprise Java Batch mit Spring

Page 2: JAX 2013 Enterprise Java Batch mit Spring · java org.springframework.batch.core.launch.support.CommandLineJobRunner testJob.xml testJob date=2012/08/29 − Standalone, 1 JVM pro

codecentric AG

Dennis Schulte

Düsseldorf

@denschu

www.github.com/denschu

blog.codecentric.de/author/dsc

tel +49 (0) 1515 _ 288 [email protected]

Page 3: JAX 2013 Enterprise Java Batch mit Spring · java org.springframework.batch.core.launch.support.CommandLineJobRunner testJob.xml testJob date=2012/08/29 − Standalone, 1 JVM pro

codecentric AG

Tobias Flohre

Düsseldorf

@TobiasFlohre

www.github.com/tobiasflohre

blog.codecentric.de/author/tobias.flohre

tel +49 (0) [email protected]

Page 4: JAX 2013 Enterprise Java Batch mit Spring · java org.springframework.batch.core.launch.support.CommandLineJobRunner testJob.xml testJob date=2012/08/29 − Standalone, 1 JVM pro

codecentric AG

AGENDA

− Grundlagen Spring Batch

− Enterprise Java Batch

− Neuigkeiten im Bereich Java Batch

Page 5: JAX 2013 Enterprise Java Batch mit Spring · java org.springframework.batch.core.launch.support.CommandLineJobRunner testJob.xml testJob date=2012/08/29 − Standalone, 1 JVM pro

codecentric AG

AGENDA

− Grundlagen Spring Batch− Was ist ein Batch?

− Domain / Konfiguration / Ablauf

− Restart / Skip / Listener

− Enterprise Java Batch

− Neuigkeiten im Bereich Java Batch

Page 6: JAX 2013 Enterprise Java Batch mit Spring · java org.springframework.batch.core.launch.support.CommandLineJobRunner testJob.xml testJob date=2012/08/29 − Standalone, 1 JVM pro

codecentric AG

WAS IST EIN BATCH?

Traditionelles Batch-Pattern

Reader Processor Writer

Page 7: JAX 2013 Enterprise Java Batch mit Spring · java org.springframework.batch.core.launch.support.CommandLineJobRunner testJob.xml testJob date=2012/08/29 − Standalone, 1 JVM pro

codecentric AG

SPRING BATCH

Automatisches Transaktionsmanagement

Skip

Retry

Persistente

Job-Metadaten

Restart

Skalierungsfeatures

Page 8: JAX 2013 Enterprise Java Batch mit Spring · java org.springframework.batch.core.launch.support.CommandLineJobRunner testJob.xml testJob date=2012/08/29 − Standalone, 1 JVM pro

codecentric AG

AGENDA

− Grundlagen Spring Batch− Was ist ein Batch?

− Domain / Konfiguration / Ablauf

− Restart / Skip / Listener

− Enterprise Java Batch

− Neuigkeiten im Bereich Java Batch

Page 9: JAX 2013 Enterprise Java Batch mit Spring · java org.springframework.batch.core.launch.support.CommandLineJobRunner testJob.xml testJob date=2012/08/29 − Standalone, 1 JVM pro

codecentric AG

DOMAIN / KONFIGURATION / ABLAUF

Item

ItemReader

ItemProcessor

Step

Job

ItemWriter

Chunk

Page 10: JAX 2013 Enterprise Java Batch mit Spring · java org.springframework.batch.core.launch.support.CommandLineJobRunner testJob.xml testJob date=2012/08/29 − Standalone, 1 JVM pro

codecentric AG

− Job wird als Spring-Konfiguration erstellt

− Domain Specific Language manifestiert sich in XML-Namespace

− Zentrale Elemente

− job

− step

− tasklet

− chunk

− reader− processor− writer− commit-interval

DOMAIN / KONFIGURATION / ABLAUF

25.04.2013 10

<job id="myJob" >

<step id="myStep" >

<tasklet>

<chunk reader="myReader"

processor="myProcessor" writer="myWriter"

commit-interval="1" />

</tasklet>

</step>

</job>

Page 11: JAX 2013 Enterprise Java Batch mit Spring · java org.springframework.batch.core.launch.support.CommandLineJobRunner testJob.xml testJob date=2012/08/29 − Standalone, 1 JVM pro

codecentric AG

− Reader, Processor und Writer implementieren bestimmte Interfaces

− ItemReader<T>

− T read()− ItemProcessor<I,O>

− O process(I item)− ItemWriter<T>

− void write(List<? extends T> items)

− Spring Batch bietet für sehr viele Use Cases Implementierungen an

− Lesen/Schreiben aus/in eine Datenbank

− Lesen/Schreiben aus/in ein Flat-File

− Lesen/Schreiben aus/in ein XML-File

− Lesen/Schreiben aus/in eine JMS-Queue

− Lesen/Schreiben mit JPA

− und viele mehr

DOMAIN / KONFIGURATION / ABLAUF

25.04.2013 11

Page 12: JAX 2013 Enterprise Java Batch mit Spring · java org.springframework.batch.core.launch.support.CommandLineJobRunner testJob.xml testJob date=2012/08/29 − Standalone, 1 JVM pro

codecentric AG

DOMAIN / KONFIGURATION / ABLAUF

25.04.2013 12

1Begin Step

Commit transaction

Finish Step

2

For each item

item == null || completionPolicy

fulfilled

true

false

list of items

list of items

item == null

true

false

Open transaction

ItemReaderItem read()

ItemProcessorprocess(Item)

ItemWriterwrite(List<Item>)

Page 13: JAX 2013 Enterprise Java Batch mit Spring · java org.springframework.batch.core.launch.support.CommandLineJobRunner testJob.xml testJob date=2012/08/29 − Standalone, 1 JVM pro

codecentric AG

*

*

*

*

DOMAIN / KONFIGURATION / ABLAUF

StepJob

JobInstance

JobExecutionStepExecution

JobParameters

Inkasso Kraftfahrt

Inkasso Kraftfahrt am 22.03.13

Inkasso Kraftfahrt am 22.03.13 erster Versuch

Page 14: JAX 2013 Enterprise Java Batch mit Spring · java org.springframework.batch.core.launch.support.CommandLineJobRunner testJob.xml testJob date=2012/08/29 − Standalone, 1 JVM pro

codecentric AG

− Infrastrukturkomponenten

DOMAIN / KONFIGURATION / ABLAUF

25.04.2013 14

JobRepository

JobLauncherPlatformTransaction

Manager

Page 15: JAX 2013 Enterprise Java Batch mit Spring · java org.springframework.batch.core.launch.support.CommandLineJobRunner testJob.xml testJob date=2012/08/29 − Standalone, 1 JVM pro

codecentric AG

AGENDA

− Grundlagen Spring Batch− Was ist ein Batch?

− Domain / Konfiguration / Ablauf

− Restart / Skip / Listener

− Enterprise Java Batch

− Neuigkeiten im Bereich Java Batch

Page 16: JAX 2013 Enterprise Java Batch mit Spring · java org.springframework.batch.core.launch.support.CommandLineJobRunner testJob.xml testJob date=2012/08/29 − Standalone, 1 JVM pro

codecentric AG

*

*

*

*

RESTART / SKIP / LISTENER

StepJob

JobInstance

JobExecutionStepExecution

JobParameters

Start des Jobs

JobInstance mit JobParamsexistiert nicht -> wird angelegt

JobExecution läuft los

Fehler!

StepExecution, JobExecution und JobInstance erhalten Status

Restart des Jobs

JobInstance mit JobParamsexistiert -> Status?

Neue JobExecution wird erzeugt, Zugriff auf ExecutionContext

Lauf erfolgreich

Page 17: JAX 2013 Enterprise Java Batch mit Spring · java org.springframework.batch.core.launch.support.CommandLineJobRunner testJob.xml testJob date=2012/08/29 − Standalone, 1 JVM pro

codecentric AG

− Überspringen fehlerhafter Elemente

RESTART / SKIP / LISTENER

Page 18: JAX 2013 Enterprise Java Batch mit Spring · java org.springframework.batch.core.launch.support.CommandLineJobRunner testJob.xml testJob date=2012/08/29 − Standalone, 1 JVM pro

codecentric AG

RESTART / SKIP / LISTENER

Page 19: JAX 2013 Enterprise Java Batch mit Spring · java org.springframework.batch.core.launch.support.CommandLineJobRunner testJob.xml testJob date=2012/08/29 − Standalone, 1 JVM pro

codecentric AG

− Listener horchen auf bestimmte Events im Batch-Ablauf

− Verschiedene Typen

− JobExecutionListener

− StepExecutionListener

− ChunkListener

− ItemReadListener

− ItemProcessListener

− ItemWriteListener

− SkipListener

RESTART / SKIP / LISTENER

Page 20: JAX 2013 Enterprise Java Batch mit Spring · java org.springframework.batch.core.launch.support.CommandLineJobRunner testJob.xml testJob date=2012/08/29 − Standalone, 1 JVM pro

codecentric AG

AGENDA

− Grundlagen Spring Batch

− Enterprise Java Batch

− Laufzeitumgebung / Integration von Fremdsystemen

− Default-Funktionalität

− Test von Jobketten

− Neuigkeiten im Bereich Java Batch

Page 21: JAX 2013 Enterprise Java Batch mit Spring · java org.springframework.batch.core.launch.support.CommandLineJobRunner testJob.xml testJob date=2012/08/29 − Standalone, 1 JVM pro

codecentric AG

− Spring Batch schreibt keine Laufzeitumgebung vor

− Anwendungsframework!

− Viele Deploymentvarianten denkbar

− Wichtige Fragen

− Werden XA-Transaktionen benötigt?

− Wie fügt sich die Ausführung des Jobs in einen Prozess ein?

− In welcher Form und wo wird der Output benötigt?

− In welcher Form soll ein Monitoring stattfinden?

LAUFZEITUMGEBUNG / INTEGRATION FREMDSYSTEME

Page 22: JAX 2013 Enterprise Java Batch mit Spring · java org.springframework.batch.core.launch.support.CommandLineJobRunner testJob.xml testJob date=2012/08/29 − Standalone, 1 JVM pro

codecentric AG

Laufzeitumgebung

LAUFZEITUMGEBUNG / INTEGRATION FREMDSYSTEME

25.04.2013 22

Spring Container

Spring Batch Application

Spring Batch Core

Spring BatchInfrastructure

Page 23: JAX 2013 Enterprise Java Batch mit Spring · java org.springframework.batch.core.launch.support.CommandLineJobRunner testJob.xml testJob date=2012/08/29 − Standalone, 1 JVM pro

codecentric AG

java org.springframework.batch.core.launch.support.CommandLineJobRunner testJob.xml testJob date=2012/08/29

− Standalone, 1 JVM pro Batch

LAUFZEITUMGEBUNG / INTEGRATION FREMDSYSTEME

25.04.2013 23

CommandLineJobLauncher

Job

DB Datei

Shell-Skript

Page 24: JAX 2013 Enterprise Java Batch mit Spring · java org.springframework.batch.core.launch.support.CommandLineJobRunner testJob.xml testJob date=2012/08/29 − Standalone, 1 JVM pro

codecentric AG

Tomcat/WebSphere/JBoss/Mule

LAUFZEITUMGEBUNG / INTEGRATION FREMDSYSTEME

25.04.2013 24

Spring Container

Spring Batch Application

HTTP EndpointTomcat

Mainframe

Jenkins

Spring Batch Admin

Scheduler

MetadatenLogs

Page 25: JAX 2013 Enterprise Java Batch mit Spring · java org.springframework.batch.core.launch.support.CommandLineJobRunner testJob.xml testJob date=2012/08/29 − Standalone, 1 JVM pro

codecentric AG

SPRING BATCH ADMIN

Page 26: JAX 2013 Enterprise Java Batch mit Spring · java org.springframework.batch.core.launch.support.CommandLineJobRunner testJob.xml testJob date=2012/08/29 − Standalone, 1 JVM pro

codecentric AG

SPRING BATCH ADMIN

Page 27: JAX 2013 Enterprise Java Batch mit Spring · java org.springframework.batch.core.launch.support.CommandLineJobRunner testJob.xml testJob date=2012/08/29 − Standalone, 1 JVM pro

codecentric AG

SPRING BATCH ADMIN

Page 28: JAX 2013 Enterprise Java Batch mit Spring · java org.springframework.batch.core.launch.support.CommandLineJobRunner testJob.xml testJob date=2012/08/29 − Standalone, 1 JVM pro

codecentric AG

LAUFZEITUMGEBUNG / INTEGRATION FREMDSYSTEME

− HTTP Endpoint mit Spring Integration

� curl –s --data-urlencode "jobParameters=datum=01.01.2013" http://localhost:8080/batch/jobs/testJob

Page 29: JAX 2013 Enterprise Java Batch mit Spring · java org.springframework.batch.core.launch.support.CommandLineJobRunner testJob.xml testJob date=2012/08/29 − Standalone, 1 JVM pro

codecentric AG

AGENDA

− Grundlagen Spring Batch

− Enterprise Java Batch

− Laufzeitumgebung / Integration von Fremdsystemen

− Default-Funktionalität

− Test von Jobketten

− Neuigkeiten im Bereich Java Batch

Page 30: JAX 2013 Enterprise Java Batch mit Spring · java org.springframework.batch.core.launch.support.CommandLineJobRunner testJob.xml testJob date=2012/08/29 − Standalone, 1 JVM pro

codecentric AG

− Vorgaben für Entwickler

− Ressourcen

− JobRepository− PlatformTransactionManager− DataSources− JMS-ConnectionFactory− Abstrakte JMSTemplate-Definitionen− Test nicht vergessen -> SpringJUnit4ClassRunner

DEFAULT-FUNKTIONALITÄT

@Test

public void testLaunchJob() throws Exception {

JobParameters jobParameters = new JobParametersBuilder().toJobParameters();

JobExecution jobExecution = jobLauncher.run(job, jobParameters);

assertEquals(BatchStatus.COMPLETED, jobExecution.getStatus());

}

Page 31: JAX 2013 Enterprise Java Batch mit Spring · java org.springframework.batch.core.launch.support.CommandLineJobRunner testJob.xml testJob date=2012/08/29 − Standalone, 1 JVM pro

codecentric AG

− Abstrakte Job- und Stepdefinitionen

DEFAULT-FUNKTIONALITÄT

Page 32: JAX 2013 Enterprise Java Batch mit Spring · java org.springframework.batch.core.launch.support.CommandLineJobRunner testJob.xml testJob date=2012/08/29 − Standalone, 1 JVM pro

codecentric AG

− Log-Files pro Job-Lauf

− Mapped Diagnostic Context -> Log-File-Name (thread-local)

− Format und Ausgabe des Job-Protokolls

− Job-Steuerung

− Revisionssichere Speicherung

− Mapping von Return-Codes

− Scheduler erwartet bestimmte Codes

DEFAULT-FUNKTIONALITÄT

Page 33: JAX 2013 Enterprise Java Batch mit Spring · java org.springframework.batch.core.launch.support.CommandLineJobRunner testJob.xml testJob date=2012/08/29 − Standalone, 1 JVM pro

codecentric AG

AGENDA

− Grundlagen Spring Batch

− Enterprise Java Batch

− Laufzeitumgebung / Integration von Fremdsystemen

− Default-Funktionalität

− Test von Jobketten

− Neuigkeiten im Bereich Java Batch

Page 34: JAX 2013 Enterprise Java Batch mit Spring · java org.springframework.batch.core.launch.support.CommandLineJobRunner testJob.xml testJob date=2012/08/29 − Standalone, 1 JVM pro

codecentric AG

Build ���� Release ���� Deploy ���� Test ���� Run

CONTINUOUS DELIVERY

25.04.2013 34

Page 35: JAX 2013 Enterprise Java Batch mit Spring · java org.springframework.batch.core.launch.support.CommandLineJobRunner testJob.xml testJob date=2012/08/29 − Standalone, 1 JVM pro

codecentric AG

JOB PIPELINE

25.04.2013 35

Page 36: JAX 2013 Enterprise Java Batch mit Spring · java org.springframework.batch.core.launch.support.CommandLineJobRunner testJob.xml testJob date=2012/08/29 − Standalone, 1 JVM pro

codecentric AG

JOB PIPELINE

25.04.2013 36

Page 37: JAX 2013 Enterprise Java Batch mit Spring · java org.springframework.batch.core.launch.support.CommandLineJobRunner testJob.xml testJob date=2012/08/29 − Standalone, 1 JVM pro

codecentric AG

JOB PIPELINE

25.04.2013 37

Page 38: JAX 2013 Enterprise Java Batch mit Spring · java org.springframework.batch.core.launch.support.CommandLineJobRunner testJob.xml testJob date=2012/08/29 − Standalone, 1 JVM pro

codecentric AG

AGENDA

− Grundlagen Spring Batch

− Enterprise Java Batch

− Neuigkeiten im Bereich Java Batch− Spring Batch 2.2

− JSR 352: Java Batch

− Spring Batch und Hadoop

Page 39: JAX 2013 Enterprise Java Batch mit Spring · java org.springframework.batch.core.launch.support.CommandLineJobRunner testJob.xml testJob date=2012/08/29 − Standalone, 1 JVM pro

codecentric AG

− In Entwicklung (bisher Release Candidate 1)

− Bugfixes und neue Features

− AmqpItemReader / AmqpItemWriter

− JobParameter bestimmen nicht zwangsläufig Identität

− Unterstützung für Java-basierte Konfiguration

SPRING BATCH 2.2

Page 40: JAX 2013 Enterprise Java Batch mit Spring · java org.springframework.batch.core.launch.support.CommandLineJobRunner testJob.xml testJob date=2012/08/29 − Standalone, 1 JVM pro

codecentric AG

− Java-basierte Konfiguration (JavaConfig)

@EnableTransactionManagement

@Configuration

public class MyConfiguration {

@Bean

public MyComponent component(){

return new MyComponent();

}

}

SPRING BATCH 2.2

− XML-basierte Konfiguration

<beans …>

<tx:annotation-driven/>

<bean id="component“

class="de.codecentric.MyComponent"/>

</beans>

Page 41: JAX 2013 Enterprise Java Batch mit Spring · java org.springframework.batch.core.launch.support.CommandLineJobRunner testJob.xml testJob date=2012/08/29 − Standalone, 1 JVM pro

codecentric AG

− Neue Annotation: @EnableBatchProcessing

− Benötigt eine DataSource und erzeugt

− JobRepository, JobLauncher, JobRegistry

− DataSourceTransactionManager

− JobBuilderFactory, StepBuilderFactory

@Configuration

@EnableBatchProcessing

public class InfrastructureConfiguration {

@Bean

public DataSource dataSource(){

EmbeddedDatabaseBuilder embeddedDatabaseBuilder = new EmbeddedDatabaseBuilder();

return embeddedDatabaseBuilder.addScript("…/schema-hsqldb.sql").setType(EmbeddedDatabaseType.HSQL)

.build();

}

}

SPRING BATCH 2.2

Page 42: JAX 2013 Enterprise Java Batch mit Spring · java org.springframework.batch.core.launch.support.CommandLineJobRunner testJob.xml testJob date=2012/08/29 − Standalone, 1 JVM pro

codecentric AG

@Configuration

public class JobConfiguration {

@Autowired

private JobBuilderFactory jobBuilderFactory;

@Autowired

private StepBuilderFactory stepBuilderFactory;

@Bean

public Job job(){

return jobBuilderFactory.get("job").start(step()).build();

}

@Bean

public Step step(){

return stepBuilderFactory.get("step").chunk(1).reader(reader()).

processor(processor()).writer(writer()).build();

}

}

SPRING BATCH 2.2

Page 43: JAX 2013 Enterprise Java Batch mit Spring · java org.springframework.batch.core.launch.support.CommandLineJobRunner testJob.xml testJob date=2012/08/29 − Standalone, 1 JVM pro

codecentric AG

AGENDA

− Grundlagen Spring Batch

− Enterprise Java Batch

− Neuigkeiten im Bereich Java Batch− Spring Batch 2.2

− JSR 352: Java Batch

− Spring Batch und Hadoop

Page 44: JAX 2013 Enterprise Java Batch mit Spring · java org.springframework.batch.core.launch.support.CommandLineJobRunner testJob.xml testJob date=2012/08/29 − Standalone, 1 JVM pro

codecentric AG

JSR 352: JAVA BATCH

− JSR 352 = Java Specification Request für Java Batch

− Haupttreiber sind IBM/VMWare

− Chris Vignola: Specification Lead (IBM)

− Michael Minella, Wayne Lund (VMWare)

− Übernahme der Domain Language von Spring Batch in großen Teilen

− JSR definiert keine Infrastruktur

Page 45: JAX 2013 Enterprise Java Batch mit Spring · java org.springframework.batch.core.launch.support.CommandLineJobRunner testJob.xml testJob date=2012/08/29 − Standalone, 1 JVM pro

codecentric AG

JSR 352: JAVA BATCH

− Interfaces vs. Annotations

public class MyItemReader implementsItemReader {

@Override

public T readItem() {...}

}

public class MyItemReader {

@ReadItempublic T readItem() {...}

}

Page 46: JAX 2013 Enterprise Java Batch mit Spring · java org.springframework.batch.core.launch.support.CommandLineJobRunner testJob.xml testJob date=2012/08/29 − Standalone, 1 JVM pro

codecentric AG

AGENDA

− Grundlagen Spring Batch

− Enterprise Java Batch

− Neuigkeiten im Bereich Java Batch− Spring Batch 2.2

− JSR 352: Java Batch

− Spring Batch und Hadoop

Page 47: JAX 2013 Enterprise Java Batch mit Spring · java org.springframework.batch.core.launch.support.CommandLineJobRunner testJob.xml testJob date=2012/08/29 − Standalone, 1 JVM pro

codecentric AG

SPRING BATCH UND HADOOP

− Spring Data: Apache Hadoop

− Version 1.0 seit 26.02.2013

− Beinhaltet Tools, Templates und Co. für eine Integration zwischen Spring und Hadoop

− Hadoop Tasklet für Spring Batch

− Einbindung von Hadoop-Jobs in Spring Batch - Jobketten

<batch:job id="springBatchJob" >

<batch:step id="step">

<batch:tasklet ref="myHadoopTasklet"/>

</batch:step>

</batch:job>

<hdp:tasklet id="myHadoopTasklet" job-ref="myHadoopJob" wait-for-job="true"/>

<hdp:job id="myHadoopJob" mapper="de.codecentric.MyMapper" reducer="de.codecentric.MyReducer"

input-path="/input" output-path="/output"/>

Page 48: JAX 2013 Enterprise Java Batch mit Spring · java org.springframework.batch.core.launch.support.CommandLineJobRunner testJob.xml testJob date=2012/08/29 − Standalone, 1 JVM pro

codecentric AG

FRAGEN?

Dennis Schulte / Tobias Flohre

codecentric AGMerscheider Straße 142699 Solingen

[email protected]

[email protected]

www.codecentric.de

www.mbg-online.de

blog.codecentric.de

www.meettheexperts.de

25.04.2013 48