Java Batch: Der neue Standard für‘s Stapeln

34
Java Batch 1.0 – Der neue Standard für‘s Stapeln Java Expertenkreis, 08.05.2014 Gedoplan IT Training Klaus Bertelt, GEDOPLAN GmbH

description

Vortrag Expertenkreis Java am 8.5.2014

Transcript of Java Batch: Der neue Standard für‘s Stapeln

Page 1: Java Batch: Der neue Standard für‘s Stapeln

Java Batch 1.0 – Der neue Standard für‘s Stapeln

Java Expertenkreis, 08.05.2014 Gedoplan IT Training

Klaus Bertelt, GEDOPLAN GmbH

Page 2: Java Batch: Der neue Standard für‘s Stapeln

Batch? Ein alter Hut!

Warum ist das jetzt so besonders? Ich mach das schon ewig!

Stimmt wohl, aber:

Bis jetzt ohne StandardIrgendwieOhne Unterstützung seitens des Servers

Mit Java-Batch in der Java EE 7 wird das anders!

2

Page 3: Java Batch: Der neue Standard für‘s Stapeln

Was ist Java - Batch

Neues Framework seit Java EE 7Stark inspiriert von Spring (Zusammenarbeit)Bietet standardisierte und serverseitige Unterstützung

ParallelisierbarStatusgesteuertEntscheidungsgesteuertSteuerung via XML oder Artefakten

Menge von Interfaces, die mit der entsprechenden Funktionalität implementiert werden könnenEE oder standalone

3

Page 4: Java Batch: Der neue Standard für‘s Stapeln

Wann nutze ich (Java) – Batch?

Batch –Kandidaten sind:

immer wiederkehrende Prozessezeit-, rechen-, oder speicherintensivohne menschliche Beteiligungklar definierbar (einzelne Schritte)

Bsp: Tägliche Aktualisierung eines Artikelstamms

4

Page 5: Java Batch: Der neue Standard für‘s Stapeln

Batch – grundlegende Begriffe

JobList: Oberstruktur im Batchprocessing. Besteht aus 1-n Jobs.Job: Bestandteil der Joblist. Kann mit anderen Jobs in Beziehung gesetzt werden. Ein Job besteht aus 1-n StepsStep: Bestandteil eines Jobs. Beinhaltet einzelne Arbeitsschritte, Chunk (Brocken, Batzen): die eigentlichen Arbeitstiere. Chunk und E.V.A. sind gute FreundeTask (Batchlet): Zuarbeiter, nicht zwangs-

läufig laufzeitintensiv.

5

Page 6: Java Batch: Der neue Standard für‘s Stapeln

Batch - grundlegende Begriffe

Flow: Abfolge von Steps, die als Einheit ausgeführt werden können.Split: Menge von Flows, die parallel ausgeführt werden können.Decision: Entscheider, z. Bsp. ob nächster Step ausgeführt wird, oder der Job terminiert wird.Partition: Möglichkeit, Batch-Mengen auf mehr als einem Thread laufen zu lassen.Checkpoint: Wird gesetzt, wenn die Ergebnisse eines Chunks übergeben wurden; Ermöglicht so das genau Ansteuern von Teilaufgaben

Für mehr Infos: http://download.oracle.com/otndocs/jcp/batch-1_0-fr-spec/

6

Page 7: Java Batch: Der neue Standard für‘s Stapeln

Batch - Struktur

JobOperator: Manager des JobsJobRepository: Enthält Infos über Jobs, die laufen oder gelaufen sind.

7

Quelle: JSR-352-1.0-Final-Release.pdf

Page 8: Java Batch: Der neue Standard für‘s Stapeln

Implementierung - Steuerdatei

In Enterprise-Applications

In Web-Applications

8

Naming: *jobID*.xml

Page 9: Java Batch: Der neue Standard für‘s Stapeln

Implementierung – So sieht sie aus:

9

<job id="adressJob" xmlns=http://xmlns.jcp.org/xml/ns/javaee” version="1.0"> <listeners> <listener ref="de.gedoplan.seminar.javabatch.batch.listener.MyJobListener"/> </listeners> <step id="buildingData" next="adressStep"> <batchlet ref="de.gedoplan.seminar.javabatch.batch.GenerateDataBatchlet" /> </step> <step id="adressStep"> <listeners> <listener ref="de.gedoplan.seminar.javabatch.batch.listener.MyStepListener"/> </listeners> <chunk item-count="10"> <reader ref="adressItemReader" /> <processor ref="adressItemProcessor" /> <writer ref="adressItemWriter" /> </chunk> </step></job>

Page 10: Java Batch: Der neue Standard für‘s Stapeln

Implementierung - BatchletTask:

Wird einmal im Step ausgeführt.

10

Job.xml:

<step id="buildingData" next="adressStep"><batchlet ref="de.gedoplan.seminar.javabatch.batch.GenerateDataBatchlet" /></step>

Implementierung:

public class GenerateDataBatchlet implements Batchlet {

@Overridepublic String process() throws Exception {return null;}

@Overridepublic void stop() throws Exception {}

Page 11: Java Batch: Der neue Standard für‘s Stapeln

Implementierung – Chunk

Chunk:Wird solange wiederholt, wie Daten vorhanden sind.

11

Job.xml:

<chunk item-count="10"> <reader ref="adressItemReader" /><processor ref="adressItemProcessor" /><writer ref="adressItemWriter" /></chunk>

1.

2.

„count“ -mal

„count“ -mal

Writer

ItemReaderItemProcessor

Page 12: Java Batch: Der neue Standard für‘s Stapeln

Implementierung – Chunk: ItemReader

Wird pro Operation (z. Bsp. Datensatz) einmal ausgeführt

12

@Namedpublic class AdressItemReader implements ItemReader {

@Overridepublic void open(Serializable checkpoint) throws Exception {}

@Overridepublic String readItem() throws Exception {return null;}

@Overridepublic Serializable checkpointInfo() throws Exception {return null;}

@Overridepublic void close() throws Exception {}

Page 13: Java Batch: Der neue Standard für‘s Stapeln

Implementierung – Chunk: ItemProcessor & ItemWriter

Wird pro Operation (z. Bsp. Datensatz) einmal ausgeführt

Wird 1 mal alle „item-counts“ ausgeführt

13

@Namedpublic class AdressItemProcessor implements ItemProcessor {

@Overridepublic Person processItem(Object arg0) throws Exception {return null;}

@Namedpublic class AdressItemWriter implements ItemWriter {

@Overridepublic void writeItems(List<Object> arg0) throws Exception {}

@Overridepublic Serializable checkpointInfo()throws Exception {return null;}

@Overridepublic void open(Serializable checkpoint) throws Exception {}

@OverridePublic void close()throws Exception {}

Page 14: Java Batch: Der neue Standard für‘s Stapeln

Implementierung - Properties

Möglichkeit 1: Übergabe bei Batch-StartJava.util.Properties erzeugenfüllenmitgeben

Möglichkeit 2: Auf nahezu jeder Ebene des job.xml können properties definiert werden:

14

<job id=„adressJob"> <properties> <property name=„adressFile" value=„adressen.txt" /> </properties> <step id=„step1"> <chunk> <properties> <property name=„adressFile" value="#{jobProperties[‚adressfile']}" /> </properties>

- jobParameters

- jopProperties- systemProper

ties- partitionPlan@Inject

@BatchProperty(name = „adressFile")private String filename;

Page 15: Java Batch: Der neue Standard für‘s Stapeln

Implementierung - CheckPoint

Optional, aber:Hilft bei Fehlern nicht komplett wieder von Vorn zu starten

Beispiel: 1.000.000 Zeilen einlesen, Zeile 999.000 führt zu einem Fehler.

Möglichkeit 1:

15

<chunk checkpoint-policy="item" commit-interval="10" item-count="10">

@Overridepublic void open(Serializable checkpoint) throws Exception {

if (checkpoint == null) {this.counter = 0;} else {this.counter = (Integer) checkpoint;}

@Overridepublic Serializable checkpointInfo() throws Exception {

return 0;}

Page 16: Java Batch: Der neue Standard für‘s Stapeln

Implementierung - Checkpoint

Schicker: Checkpoint Algorithm

16

@Namedpublic class AdressCheckpointAlgorithm extends AbstractCheckpointAlgorithm {

@Overridepublic void beginCheckpoint() throws Exception {System.out.println("Etwas zum Anfang machen.");}

@Overridepublic void endCheckpoint() throws Exception {System.out.println("Etwas zum Ende machen.");}

@Overridepublic boolean isReadyToCheckpoint() throws Exception {

return AdressItemReader.COUNT % 100 == 0;}}

Job.xml: <chunk checkpoint-policy="custom"

WICHTIG:

ReaderCheckpoints

sind unabhängig

von

WriterCheckpoints

und umgekehrt!

Page 17: Java Batch: Der neue Standard für‘s Stapeln

Implementierung - Partition

Möglichkeit auf Step-Ebene Prozesse parallel auf mehreren Threads ablaufen zu lassen

17

Step

Chunk

ItemReader

ItemWriter

Chunk

ItemReader

ItemWriter

ItemProcessor

ItemProcessor

Chunk

ItemReader

ItemWriter

ItemProcessor

Page 18: Java Batch: Der neue Standard für‘s Stapeln

Implementierung – Partitioning

Entweder PartitionPlan

Oder PartitionMapper

18

<chunk>…<properties> <property name="firstItem" value="#{partitionPlan['firstItem']}"/> <property name="lastItem" value="#{partitionPlan['lastItem']}"/></properties>…</chunk>

public class MyMapper implements PartitionMapper{

@Overridepublic PartitionPlan mapPartitions() throws Exception {return null;}

public void setThreads(…)public void setPartitionsOverride(…)public void setPartitions(…)public void setPartitionProperties(…)public int getThreads()public boolean getPartitionsOverride()public int getPartitions()public Properties[] getPartitionProperties()

<partition> <mapper ref="MyPartitionMapperImpl"/> …</partition>

Job.xml:

<partition> <plan partitions="2" threads="2"> <properties partition="0"> <property name="firstItem" value="0"/> <property name="lastItem" value="500"/> </properties> <properties partition="1"> <property name="firstItem" value="501"/> <property name="lastItem" value="999"/> </properties> </plan> </partition>

Page 19: Java Batch: Der neue Standard für‘s Stapeln

Implementierung - Partitioning

Reducer: Implementierung von PartitionReducerSteuerung der Partitionen

Collector:Implementierung von PartitionCollectorSenden von Zwischenergebnissen einzelner Partitionen

Analyser:Implementierung von PartitionAnalyserAnalyse der Zwischen- und Endergebnisse

19

<partition> <reducer ref=„…“/> <collector ref=„…“/> <analyser ref=„…“/></partition>

Page 20: Java Batch: Der neue Standard für‘s Stapeln

Implementierung – Flow, Split und Decision

Kurz angerissen:Flow:

Führt Elemente als Einheit ausKann weitere Flows, Decision, Splits enthalten

Split:Führt Elemente gleichzeitig aus (jedes auf einem eigenen Thread)Kann Flows enthalten

Decision:Ermöglicht Entscheidungen bzgl. weiterer VerarbeitungKann Steps, Flows, Splits enthalten

20

Page 21: Java Batch: Der neue Standard für‘s Stapeln

Implementierung Transitions

Kurz angerissen:Transitions ermöglichen die Steuerung nach einem Step, Flow, Split oder Decision für die nächsten Schritte:

Next: Das nächste Element wird ausgeführtFail: Job endet mit Status: FAILEDEnd: Job endet mit Status: COMPLETEDStop: Job endet mit Status: STOPPED

21

<next on="{exit status}" to="{step id|flow id|split id}”/><fail on="{exit status}" exit-status="{exit status}"/>

Page 22: Java Batch: Der neue Standard für‘s Stapeln

Flow

Wie kann das aussehen?

22

Step I

Task

Step II

Chunk

ItemReader

ItemWriter

Step III

Chunk

Deci-

sion

ItemReader

ItemWriter

Step IV

Chunk

ItemReader

ItemWriter

EndeStart

ItemProcessor

ItemProcessor

ItemProcessor

Page 23: Java Batch: Der neue Standard für‘s Stapeln

Implementierung – Listener

Für weitere Operationen können auf die verschiedenen Bestandteile des Batch Listener gelegt werden:

JobJobListener

StepStepListenerItemReadListener, ItemProcessListener, ItemWriteListenerChunkListener RetryReadListener, RetryProcessListener, RetryWriteListener SkipReadListener, SkipProcessListener, SkipWriteListener

23

Page 24: Java Batch: Der neue Standard für‘s Stapeln

Implementierung – im xmlJob-Ebene

Step-Ebene

24

<step id="adressStep"><listeners><listener ref="de.gedoplan.seminar.javabatch.batch.listener.MyStepListener"/><listener ref="de.gedoplan.seminar.javabatch.batch.listener.MyChunkListener"/><listener ref="de.gedoplan.seminar.javabatch.batch.listener.MyBatchletListener"/>…</listeners>

<job id="adressJob" xmlns="http://xmlns.jcp.org/xml/ns/javaee"version="1.0"><listeners><listener ref="de.gedoplan.seminar.javabatch.batch.listener.MyJobListener"/></listeners>

Page 25: Java Batch: Der neue Standard für‘s Stapeln

Implementierung - Exceptions

1. es! passieren! keine! Fehler!!!!2. Aber, was wenn doch?

Nicht abgefangene Exceptions terminieren mit Status FAILEDVerhalten kann überschrieben werden

Retryable Exceptions: Prozess versucht‘s nochmal

25

<skippable-exception-classes> <include class="{fullpackage-classname}"/> <exclude class="{fullpackage-classname}"/></skippable-exception-classes>

Page 26: Java Batch: Der neue Standard für‘s Stapeln

Implementierung – Wie starte ist das Ganze?

Starten:

Restarten (nach Fehler, Stopp):

Wichtig: restart funktioniert nur wenn Status != COMPLETED, ABANDONED

26

JobOperator jobOperator = BatchRuntime.getJobOperator(); Properties props = new Properties(); props.setProperty("parameter1", "value1"); ... long execID = jobOperator.start("simplejob", props);

executionId = BatchRuntime.getJobOperator().restart(executionId, new Properties());

Page 27: Java Batch: Der neue Standard für‘s Stapeln

Statüsse … Stati … Statanten … Status (plural)!

STARTING: Job/Step wurde an die Batch runtime übermittelt.STARTED: Job/Step läuft.STOPPING: Job/Step hat einen entsprechenden Halt-Request. bekommen.STOPPED: Job/Step ist gestoppt.FAILED: Job/Step ist aufgrund eines Fehlers beendet. (z. Bsp. bei jeder nicht gefangenen Exception)COMPLETED: Job/Step ist erfolgreich durchgelaufen.ABANDONED: Job/Step ist beendet.

27

Page 28: Java Batch: Der neue Standard für‘s Stapeln

STOPPED

Was kann alles so passieren?

28

STARTING STARTEDCOMPLET

ED

FAILED

STOPPING

ABANDONED

stop()

start()

abandon()

abandon()

abandon()

restart()

restart()

Page 29: Java Batch: Der neue Standard für‘s Stapeln

Demo

29

LIVE -

DEMO

Page 30: Java Batch: Der neue Standard für‘s Stapeln

Monitoring – Im WildFly? Fehlanzeige

Es gibt zwar Einstellungen für Batching, aber die betreffen mehr die Thread Eigenschaften

30

Page 31: Java Batch: Der neue Standard für‘s Stapeln

Monitoring – Gott Sei Dank recht einfach selbst geschrieben

Grundlegende Möglichkeiten:JobOperator

JobExecution

StepExecution

Aus der Demo:

31

JobExecution execution = jo.getJobExecution(executionId);

List<StepExecution> steps = jo.getStepExecutions(executionId);

JobOperator jo = BatchRuntime.getJobOperator();

s.setName(se.getStepName());s.setStatus(se.getBatchStatus().toString());s.setExitStatus(se.getExitStatus());

Page 32: Java Batch: Der neue Standard für‘s Stapeln

Monitoring – Innerhalb des Batches

JobContext

StepContext

Beispiele:

32

@Injectprivate JobContext jc;

@Injectprivate StepContext sc;

sc.getBatchStatus();sc.getExitStatus();sc.setExitStatus();

Page 33: Java Batch: Der neue Standard für‘s Stapeln

Fazit

Endlich ein StandardVereinfacht viele DingeBietet viele Möglichkeiten

… die man selbst schreiben muss(Noch) wenig Infos im NetzIst neu und es gibt noch keine (nicht viel) Produktiverfahrung.

Bisherige Erfahrungen gut!ABER: Oracle, da geht noch

was!!!33

Page 34: Java Batch: Der neue Standard für‘s Stapeln

Vielen Dank für die Aufmerksamkeit!

Noch Fragen?

34