document

Werbung
JAVA Mag
Micro Batch Services powered by Spring Boot 58
10.2014
magazin
Java • Architekturen • Web • Agile
www.javamagazin.de
7
Semantic Versioning
Gradle 2.0
Sinn für die Versionsnummer 12
Die neuen Features im Überblick 14
Java EE
Ab in den siebten Himmel
Best Practices: WildFly-8Installationen verwalten
Buchtipp zu Java EE 7
r
ü
f
k
c
u
r
onderd
34
40
47
S Multi-Browser-Tab-Support
e
d
.
c
i
r
t
n
e
c
e
50
© iStockphoto.com/Kngkyle2
www.cod
Proxy oder Delegator – das ist hier die
Frage 18
infos
Programm
9!
ab Seite 1
Continuous Delivery
für PaaS: Pipeline automatisieren 72
Architekturvalidierung:
Auf die inneren Werte
kommt es an 96
© iStockphoto.com/liangpv
Sonderdruck
Agile
Micro Batch Services powered by Spring Boot
Batcharchitektur
in the Enterprise
Immer mehr Unternehmen setzen auf Batchverarbeitung in Java – nur wie macht man es
richtig? In diesem Artikel stellen wir die unserer Erfahrung nach optimale Architektur für
Batch Services im Enterprise-Umfeld zunächst frameworkneutral vor: verteilte Umgebung,
Container, Kommunikation über HTTP, fertig. Vielfach kundenerprobt. Und doch – ganz problemfrei und schnell geht es nicht immer. Aufwände fließen in die Entwicklung eines eigenen Meta-Batch-Frameworks, der Umgang mit den Application Servern ist nicht immer ganz
einfach, und schnell entstehen Batchmonolithen mit Unmengen von Jobs – ein Horror für
Updates und Testing. Wie kann man diese Aufwände umgehen? Dieser Artikel zeigt, wie ein
eigener Spring Boot Starter dafür sorgt, dass man nur noch Jobs schreiben muss und alles
andere geregelt ist.
von Tobias Flohre und Dennis Schulte
Es gibt viele verschiedene Wege, Batch Jobs zu schreiben
und zu betreiben, und dieser Artikel hat nicht zum Ziel
diese alle aufzulisten – dafür wäre auch gar kein Platz.
Hier soll es um den unserer Erfahrung nach optimalen
Weg im Enterprise-Umfeld gehen. Und dann wollen wir
noch aufzeigen, was Microservices damit zu tun haben.
Bei der Einführung von Java Batch im Unternehmen
müssen drei Fragen beantwortet werden:
2
javamagazin 10 | 2014
1.Soll ein Framework verwendet werden? Wenn ja,
welches?
2.Wie sollen die Batch Jobs betrieben werden?
3.Wie werden die Batch Jobs ins Unternehmen eingebunden? Wer startet sie?
1. Soll ein Framework verwendet werden? Wenn ja,
welches?
Es gibt gewisse Features, die man bei der Batchentwicklung immer benötigt, dazu gehören automatisches
© Software & Support Media GmbH
www.JAXenter.de
Sonderdruck
Agile
Transaktionsmanagement, persistente Jobmetadaten
und Fehlerhandling, und häufig möchte man auch Restart-Fähigkeit und Skalierungsmöglichkeiten haben.
Ein unternehmensweit einheitliches Programmiermodell für Jobs hat ebenfalls viele Vorteile. Ein etabliertes
Framework zu verwenden, ergibt also Sinn. Wir haben
sehr gute Erfahrungen mit Spring Batch [1] gemacht,
aber wir sind auch nicht darauf fixiert – der Batchstandard JSR 352 [2] beinhaltet die oben genannten Features, und andere Implementierungen als Spring Batch
können ebenfalls sinnvoll sein [3].
2. Wie sollen die Batch Jobs betrieben werden?
Weder der JSR 352 noch Spring Batch geben vor, wie
Jobs betrieben werden, auch wenn einige JSR-352-Implementierungen direkt an Java-EE-Container gebunden sind. Prinzipiell hat man also die Wahl, ob man
für jeden Batchlauf eine eigene JVM startet, ob man die
Jobs in einen Java EE Application Server deployt oder
ob ein Servlet-Container ausreicht. Wir empfehlen aus
folgenden Gründen den Betrieb in einem Servlet Container/Application Server:
•HTTP ist ein etabliertes Protokoll zur Kommunikation zwischen Anwendungen auch in polyglotten Umgebungen, das auch gut abgesichert werden kann.
•Ein kontinuierlich laufender Batchserver ermöglicht
ein Fail Fast. Bereits beim Hochfahren werden umgebungsabhängige Konfigurationen und Verbindungen
zu Fremdsystemen geprüft, sodass beim tatsächlichen
Jobstart weniger Fehlerquellen vorhanden sind.
•Monitoring für Servlet Container ist etabliert – sei es
über HTTP, JMX oder als Support für einen konkreten Application Server.
•Das Speichermanagement ist mit kontinuierlich laufenden Anwendungen einfacher. Sollten JVMs beliebig gestartet und gestoppt werden, kann es passieren,
dass das Betriebssystem nicht so viel Speicher zur
Verfügung stellen kann wie gerade benötigt wird.
Dazu kommen in vielen Unternehmen hausweite Vorgaben für den Betrieb von Java-Anwendungen, die
diesen auf bestimmte lizenzierte Systeme mit EnterpriseSupport einschränken. WebSphere-, JBoss-, GlassFish-,
WebLogic- und Tomcat-Server sind hier oft genutzte
Kandidaten und funktionieren mit unserem Ansatz.
3. Wie werden die Batch Jobs ins Unternehmen
eingebunden? Wer startet sie?
Die Jobsteuerung und die konkrete Jobausführung sollten immer entkoppelt sein (Abb. 1). Dabei empfehlen
wir ein REST-like HTTP-API auf der Seite der Batchanwendung, das vier Funktionen hat:
•Job starten
•Status des Jobs abfragen
•Job stoppen
•Protokoll des Joblaufs abholen
www.JAXenter.de
Abb. 1: Jobsteuerung und -ausführung
Für die Jobsteuerung gibt es in den meisten größeren
Unternehmen, die auch noch einen Mainframe betreiben, eine zentrale Stelle, über die alle Jobs eingeplant
werden. Hier stellt sich die Frage der Anbindung unseres
Batchservers. Sollte es so einen Scheduler noch nicht geben, ist die Wahl der Mittel frei – von einem einfachen
Cron-Job bis zur Einbindung in ein Workflowsystem ist
alles möglich. Wie auch immer der Client aufgebaut ist,
bei der Kommunikation mit unserem Batchserver sollte
er diesen einfachen Algorithmus verwenden:
•den Job starten,
•dann in regelmäßigen Intervallen prüfen, ob der Job
beendet wurde,
•und sobald das der Fall ist, das Jobprotokoll auslesen
und zurückgeben.
Wir sind sehr für einfache Lösungen, und da bietet es
sich an, diese Logik in ein Skript zu verpacken. Hier
kann dann auch direkt ein Shutdown Hook eingebaut
werden, der den Job stoppt, falls der Operator das Skript
beendet, sodass ein konsistenter Stand gewährleistet
werden kann. Beim Ausführungsort und der gewählten
Skriptsprache ist man frei – viele unserer Kunden betreiben ihr Jobsteuerungssystem bzw. Scheduler auf dem
Mainframe, und hier bietet sich beispielsweise REXX
an. In Unix-basierten Umgebungen führt ein einfaches
Shellskript natürlich auch zum Ziel.
Herausforderungen
So weit, so gut – dieses Konzept funktioniert so schon
in vielen Unternehmen, und doch gibt es einige Herausforderungen:
Es entstehen Monolithen – Nach Conways Gesetz [4]
spiegelt sich in erstellten Systemen die Kommunikationsstruktur des Unternehmens. Häufig äußert sich das
dadurch, dass es eine Batchanwendung pro Abteilung
gibt, auf der sich mit der Zeit immer mehr Jobs einfinden. Jede Veränderung der Anwendung wird dadurch
erschwert, dass potenziell alle anderen Jobs betroffen
sein könnten und deshalb nachgetestet werden müssen.
Und auch wenn man viel automatisiert testen kann –
gerade im Batchbereich gibt es immer wieder Konstel-
© Software & Support Media GmbH
javamagazin 10 | 2014
3
Sonderdruck
Agile
lationen, die automatisierte Tests erschweren, vor allem
wenn es darum geht, produktionsnahe Daten und Datenmengen zu verarbeiten.
Die Handhabung von Containern ist unnötig komplex – Wie Eberhard Wolff in seinem Artikel über den
Tod des Application Servers [5] schreibt, gibt es einige
Argumente gegen eine Separation von Anwendung und
Container, die auch hier greifen:
•Ein Parallelbetrieb von mehreren Batch- und Onlineanwendungen auf einem Application Server ist bezüglich der Ressourcen gefährlich und wird deshalb
allgemein vermieden. Viele Features eines Application
Servers bleiben so zu Recht ungenutzt.
•Der Application Server hängt durch anwendungsspezifische Ressourcen davon ab, die Anwendung
wiederum vom Application Server – diese zyklische
Abhängigkeit indiziert eine enge Kopplung. In der
täglichen Arbeit behindert uns diese Abhängigkeit
durch komplexes Aufsetzen von (Entwicklungs-)
Umgebungen für unterschiedliche Versionen unserer
Software.
Listing 1
<?xml version="1.0" encoding="UTF-8"?>
<project ...>
<modelVersion>4.0.0</modelVersion>
<groupId>de.codecentric.batch</groupId>
<artifactId>batch-boot-simple</artifactId>
<version>0.0.1-SNAPSHOT</version>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
javamagazin 10 | 2014
Wir streben also eine Lösung der skizzierten Herausforderungen an, die folgende Ziele unterstützt:
1.Unsere favorisierte Architektur/Unternehmensintegration soll out of the box unterstützt werden.
2.Die Verwendung sollte extrem einfach sein. Außer
dem Schreiben von Jobs sollte alles geregelt sein.
Durch die einfache Verwendung ist es dann auch
kein Problem, für jeden Job eine eigene Anwendung
zu haben.
3.Die Lösung sollte allgemein benötigte Funktionalität, die wir sonst bei jedem Kunden neu entwickelt
haben, automatisch beinhalten, um die Aufwände
für das Batch-Meta-Framework gering zu halten.
Micro Batch Services
<dependencies>
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-starter-batch-web</artifactId>
<version>1.0.0.RELEASE</version>
</dependency>
</dependencies>
4
Die Lösung der Probleme
Wie kann sie aussehen?
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.0.2.RELEASE</version>
</parent>
</project>
Ein Batch-Meta-Framework wird benötigt – Die Verwendung von Spring Batch oder einer anderen JSR352-Implementierung allein reicht nicht. Ein Scheduling
muss immer angebunden werden, außerdem gibt es
meistens noch weitere unternehmensweit einheitliche
Vorgaben, die jeder Batch Job umsetzen muss, wie beispielsweise ein einheitliches Jobprotokoll, Logfiles pro
Joblauf etc. Auch für das Monitoring muss man noch
aktiv werden. Dieses Batch-Meta-Framework muss
ebenfalls gepflegt werden, den Aufwand darf man nicht
unterschätzen. Der Umgang mit diesen Herausforderungen bestimmt sehr stark den Gesamtaufwand, den wir
im Batchbereich im Unternehmen haben.
Die grundsätzliche Basis für die Lösung ist, wie der Titel schon vermuten lässt, eine Microservices-Architektur [6]. Ein Batch Job passt optimal in dieses Paradigma
– es handelt sich um ein fachlich eigenständiges Modul,
das sich leicht austauschen lässt. Er hat eine klar definierte REST-Schnittstelle (s. o.), und ein GUI wird in
diesem Fall nicht benötigt. Durch die totale Prozessisolation, die Nutzung eines eigenen Heaps, sind GC-Probleme oder sonstige Speicher-Leaks durch Seiteneffekte
ausgeschlossen, und auch sonst kann von allen Vorteilen dieses Konzepts profitiert werden.
Wir wollen also tatsächlich möglichst immer nur einen
Job in einer Anwendung betreiben. Das ermöglicht den
parallelen Betrieb unterschiedlicher Versionen einer bestimmten Batch- oder fachlichen Bibliothek. Natürlich
wird es immer Batch Jobs geben, die sich fachlich so nahe
stehen, dass sie einen Großteil ihres Codes teilen können.
Hier muss man nun mit gesundem Menschenverstand arbeiten. Ergibt es Sinn, diese doch in einer gemeinsamen
Anwendung zu betreiben? Löst man den geteilten Code
heraus in eine Bibliothek, die von beiden verwendet wird?
Wir kennen viele Beispiele, in denen das „Don’t Repeat
Yourself“-Prinzip übertrieben wurde und in unverständlichen, generischen Alleskönnerkomponenten mündete.
Manchmal ist es auch einfach okay, sich zu wiederholen.
© Software & Support Media GmbH
www.JAXenter.de
Sonderdruck
Agile
Im Bereich Migration von Legacy-Anwendungen, in
dem Java Batch stark im Kommen ist – viele alte Cobolbatches werden aktuell auf Java umgestellt – kann man
nun schrittweise vorgehen und die alten Batches Anwendung für Anwendung auf eine neue und moderne
Plattform stellen.
Spring Boot
Nur wie setzen wir das um? Spring Boot hat sich als
gute Basis unserer Arbeit erwiesen. Die jetzt geschaffene
Lösung bietet einen maßgeschneiderten Batchserver, benötigte dabei aber nur wenig Aufwand.
Spring Boot ist ein relativ neues Projekt im Spring-Ökosystem, das auf den anderen Frameworks aufsetzt [7]. Für
unterschiedliche Technologien gibt es Spring Boot Starter
POMs, die man per Maven oder Gradle einbinden kann,
und dann wird über Auto-Configuration der ApplicationContext der Anwendung automatisch um entsprechende Konfigurationen erweitert. Bei Einbindung von
spring-boot-starter-web wird beispielsweise Spring MVC
passend aufgesetzt und ein Embedded Tomcat gestartet,
sodass ein Deployment in einem Servlet Container nicht
mehr notwendig ist. Eine Einführung in dieses Projekt
gab es bereits im Java Magazin 1.2014 [8].
spring-boot-starter-batch-web
Unsere Lösung besteht aus einem eigenen Spring Boot
Starter [9], der wiederum diese vier Standard-Boot-Starter einbindet:
•spring-boot-starter-batch konfiguriert die Batchinfrastruktur.
•spring-boot-starter-web erzeugt die Webinfrastruktur, sodass wir einfach Web-Endpoints erstellen können.
•spring-boot-starter-jdbc sorgt für eine gepoolte, konfigurierbare JDBC DataSource.
•spring-boot-starter-actuator bietet diverse Monitoring- und Operationswerkzeuge.
Alle Konfigurationsmöglichkeiten dieser vier Starter
können wie in der Spring-Boot-Referenz beschrieben
genutzt werden.
In spring-boot-starter-batch-web fügen wir die Features hinzu, die uns jetzt noch zur optimalen Lösung
fehlen. Wenn Sie wollen, öffnen Sie einfach Ihre favorisierte Entwicklungsumgebung, und führen Sie die folgenden Schritte mit uns durch. Der Weg zum fertigen
Batchserver inklusive Job benötigt nur wenige Minuten.
2.Als Parent wird spring-boot-starter-parent eingetragen. Dieser bringt Dependency-Management und
zueinander passende Versionen von Abhängigkeiten
mit sich. In vielen Unternehmen existieren eigene
Parents, sollten diese wirklich unbedingt benötigt
werden, so kann Spring Boot auch ohne springboot-starter-parent funktionieren [10].
3.Das spring-boot-maven-plugin wird hinzugefügt. Es
sorgt dafür, dass durch ein mvn package ein einzelnes ausführbares Jar erzeugt wird, das alle benötigten Libraries als Jars enthält, auch Fat Jar genannt.
Logging
Damit die Log-File-Separation funktioniert, wird eine
logback.xml im Root des Klassenpfads (also im MavenProjekt unter src/main/resources) benötigt, die unsere
Logging-Basiskonfiguration einbindet (Listing 2). Hier
können auch weitere Logging-Konfigurationen vorgenommen werden.
Datenbankanbindung
Im Regelfall möchte man die Spring-Batch-Metadaten
in einer Datenbank halten, damit sie auch noch auswertbar sind, wenn der Batchserver nicht mehr läuft. Zur
Erstellung dieser Tabellen bietet Spring Batch Skripte
für die unterschiedlichsten relationalen Datenbanken
an. Die Verbindungsdaten werden der Anwendung als
Properties mitgegeben. Dafür kann bei Spring Boot eine
application.properties-Datei im Root des Klassenpfads
angelegt werden (also wiederum unter src/main/resources), in die dann die entsprechenden Einträge eingesetzt
werden können (Listing 3). Werden keine Verbindungsdaten angegeben, wird automatisch eine In-MemoryDatenbank genutzt.
Jobs
Spring Batch unterstützt verschiedene Formate für die
Konfiguration von Jobs, die drei wichtigsten sind dabei XML, JavaConfig und JSR 352 Style. Wir werden in
diesem Artikel den Job in XML konfigurieren, da dieser
Ansatz zurzeit noch am bekanntesten ist. Dabei nutzen
Listing 2
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="logback-batch-base.xml" />
</configuration>
Erstellung des Maven-Projekts
Wir erstellen ein Standard-Maven-Projekt, Unterstützung dafür gibt es in jeder IDE. Listing 1 zeigt die benötigte Maven-POM. Dabei gibt es drei Besonderheiten:
1.Als Dependency wird unser spring-boot-starterbatch-web-Projekt eingetragen. Das ist wenig überraschend.
www.JAXenter.de
Listing 3
spring.datasource.url=jdbc:hsqldb:hsql://localhost/
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.driverClassName=org.hsqldb.jdbcDriver
© Software & Support Media GmbH
javamagazin 10 | 2014
5
Sonderdruck
Agile
wir einen ItemReader, der hart kodierte Werte zurückgibt, und einen ItemWriter, der sie loggt. Die Implementierungen und weiteren Konfigurationsstile finden sich
unter [9].
Bei der Konfiguration in XML (Listing 4) muss die
Datei im Klassenpfad unter META-INF/spring/batch/
jobs platziert werden, damit sie automatisch gefunden
wird. Dieser Pfad kann mithilfe der Property batch.config.path.xml überschrieben werden.
Spring-Boot-Startklasse
Als Entry Point in die Anwendung dient eine Klasse mit
einer main-Methode (Listing 5). In einer IDE kann diese
Listing 4
<?xml version="1.0" encoding="UTF-8"?>
<beans ...>
<bean id="reader" class="de.codecentric.DummyItemReader"/>
<bean id="writer" class="de.codecentric.LogItemWriter"/>
<batch:job id="flatfileJob">
<batch:step id="step">
<batch:tasklet>
<batch:chunk reader="reader" writer="writer" commit-interval="3" />
</batch:tasklet>
</batch:step>
</batch:job>
</beans>
Listing 5
Listing 6
$ curl --data '' localhost:8080/batch/operations/jobs/{jobname}
$ curl localhost:8080/batch/operations/jobs/executions/{executionId}
$ curl localhost:8080/batch/operations/jobs/executions/{executionId}/log
$ curl -X DELETE localhost:8080/batch/operations/jobs/executions/{executionId}
Nun kann das Projekt mit einem mvn package gebaut
werden. Das dabei entstandene .jar-File kann mittels
java –jar <filename>.jar gestartet werden, und schon
haben wir einen laufenden Batchserver, auf dem unsere
konfigurierten Jobs deployt sind.
Mithilfe eines Operations HTTP Endpoints können
Jobs gestartet und gestoppt werden, außerdem kann auf
den BatchStatus des Jobs gepollt werden, um mitzubekommen, wenn er beendet wird, und das Logfile für den
Joblauf kann heruntergeladen werden. Listing 6 zeigt
die dazugehörigen curl-Befehle.
Ein Monitoring-HTTP-Endpoint liefert Informationen über deployte Jobs, über laufende Jobs und Detailinformationen zu jedem Joblauf (Listing 7).
Zusätzlich dazu ist das Spring-Boot-Actuator-Projekt
automatisch mit eingebunden, sodass dessen Endpoints
genutzt werden können. Eine komplette Auflistung findet sich unter [11]. Es sind viele interessante darunter,
beispielsweise kann ein Thread-Dump der Anwendung
über http eingesehen werden, diverse Metriken werden
geführt, und ein Health-Check der Anwendung ist darüber ebenfalls einfach möglich.
Spring Boots Nutzung eines eingebetteten Servlet
Containers zusammen mit unseren batchspezifischen
automatisch konfigurierten Features ergibt einen kleinen, aber feinen Batchserver mit genau den Funktionen,
die wir benötigen, und der mit einfachen Java-Mitteln
gestartet werden kann. Weitere Batchfeatures sind in
Planung.
Verteilte XA-Transaktionen sind mit dem eingebetteten
Tomcat nicht out of the box möglich. Da sie aus Performancegründen zu vermeiden sind und viele der neueren
Data-Storing-Technologien XA-Transaktionen sowieso
nicht unterstützen, ist dieser Nachteil gegenüber einem
Java-EE-Server vielleicht nicht so relevant. Für Transaktionen über eine JMS- und eine Datenbankressource
gibt es das Best Effort Pattern. Bei zwei Datenbanken
kann eventuell das Shared Resource Pattern Anwendung finden [12]. Wenn das auch nicht möglich ist, kann
entweder teilweise auf Transaktionalität verzichtet oder
eine eigenständige JTA-Implementierung wie Atomikos
verwendet werden.
Wie schreibt man eine eigene SpringBoot-Erweiterung?
Listing 7
$ curl localhost:8080/batch/monitoring/jobs
$ curl localhost:8080/batch/monitoring/jobs/runningexecutions
$ curl localhost:8080/batch/monitoring/jobs/runningexecutions/{jobName}
$ curl localhost:8080/batch/monitoring/jobs/executions/{executionId}
javamagazin 10 | 2014
Der Batchserver und seine Features
Was geht nicht?
@Configuration
@EnableAutoConfiguration
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
6
Klasse direkt gestartet werden, um die komplette Anwendung hochzufahren.
Das Schreiben einer eigenen Erweiterung ist zwar einfach,
aber detailliert nicht in wenigen Sätzen zu erklären, deswegen wird es dazu einen eigenen Artikel im nächsten Java
Magazin geben.
© Software & Support Media GmbH
www.JAXenter.de
Sonderdruck
Agile
Die Batchentwicklung in Java ist im Kommen. Wenn man die
grundsätzlichen Architekturprinzipien aus diesem Artikel befolgt,
ist man auf jeden Fall schon auf dem richtigen Weg.
Betrieb: natürlich, ganz ohne Application Server
Der Build liefert uns also ein ausführbares Jar – schauen wir uns nun die letzten Meter auf dem Weg in die
Produktion an. Die natürlichste Art, auf Unix-Systemen
Anwendungen zu installieren, ist die Nutzung von Paketformaten wie RPM und deb. Außer dem ausführbaren Jar benötigen wir im Paket noch ein Init-Skript, mit
dem unsere Batchanwendung gestartet werden kann, für
ein Beispiel siehe [13]. Es kann einfach aufgerufen werden, ohne dass man die Spezifika des jeweiligen Service
kennen muss, und es umfasst meist ein Start-, Stop-, Restart- und Statuskommando.
Ein RPM kann relativ einfach mit Maven erzeugt
werden (siehe dazu die Beispielkonfiguration des rpmmaven-plugin unter [14]). Ein RPM fasst die zu installierenden Artefakte und das so genannte Spec-File zu
einem Paket mit der Endung .rpm zusammen. Im SpecFile steht dann, was zum Installations- und zum Deinstallationszeitpunkt geschehen soll, also das Kopieren
der Artefakte, Rechtevergabe etc.
Zur letztendlichen Durchführung der Installation des
RPMs wird der jeweilige Paketverwalter der verwendeten Linux-Distribution wie z. B. zypper bei SUSE, APT
bei Ubuntu oder auch Yum bei Red Hat verwendet.
Eventuell vorhandene umgebungsabhängige Properties
werden zum Installationszeitpunkt aus einem SCM geladen. Zur weitergehenden Automatisierung der Provisionierung können Konfigurationsmanagementwerkzeuge
wie z. B. Puppet [15], Chef [16] oder Ansible [17] eingesetzt werden. Die Verwendung eines standardisierten
und dem Systemadministrator bekannten Werkzeugs
erleichtert die Übergabe in Produktion. Im Problemfall
kann sehr einfach eine alte Version der Anwendung
über den Paketverwalter wiederhergestellt werden.
Tobias Flohre arbeitet als Senior-Softwareentwickler bei der codecentric AG. Seine Schwerpunkte sind Java-Enterprise-Anwendungen und Architekturen mit JEE/Spring, häufig mit Fokus auf Spring
Batch. Er spricht regelmäßig auf Konferenzen und bloggt auf blog.
codecentric.de.
[email protected].
Dennis Schulte ist seit 2009 als Senior IT Consultant bei der codecentric AG tätig. Er unterstützt seine Kunden insbesondere im Bereich Enterprise-Architekturen und der Optimierung von IT-Prozessen.
Aufgrund seiner langjährigen Erfahrung als Architekt und Entwickler
verfügt er über ein umfassendes Wissen im Bereich Java EE und
Open-Source-Technologien und hier insbesondere im Umfeld Spring Batch und
Massendatenverarbeitung. Seine Projektschwerpunkte liegen in der Architekturberatung und der Durchführung von Projekten im Versicherungsumfeld.
Links & Literatur
[1] http://projects.spring.io/spring-batch/
[2] https://jcp.org/en/jsr/detail?id=352
[3] http://bit.ly/1p6fNXn
[4] http://de.wikipedia.org/wiki/Gesetz_von_Conway
[5] Wolff, Eberhard: „Der Tod der Java Application Server“, in Java Magazin
7.2014
[6] Wolff, Eberhard: „Microservices“, in Java Magazin 8.2014
[7] http://projects.spring.io/spring-boot/
[8] Wolff, Eberhard: „Spring Boot“, in Java Magazin 1.2014
Fazit
Die Batchentwicklung in Java ist im Kommen. Wenn
man die grundsätzlichen Architekturprinzipien vom Anfang des Artikels befolgt, ist man auf jeden Fall schon
auf dem richtigen Weg.
Die dann im Folgenden beschriebene Verwendung
von Spring Boot bietet ein einfaches Programmier- und
Betriebsmodell, in dem alle wichtigen Funktionalitäten
bereits implementiert sind: HTTP Endpoints für das
Starten, Stoppen und Überwachen von Jobs sowie für
diverse Monitoringfunktionen vom Thread-Dump bis
zu Joblaufinformationen. Dieser Spring Boot Starter ist
dabei kein Spielprojekt – er ist bereits in Produktion im
Einsatz.
www.JAXenter.de
Die einfache Projekterzeugung und der unkomplizierte Betrieb mit Spring Boot ermöglicht dabei die Limitierung auf einen Job pro Anwendung – Micro Batch
Services.
[9] https://github.com/codecentric/spring-boot-starter-batch-web
[10] http://stackoverflow.com/questions/20731158/maven-module-usingspring-boot
[11] http://bit.ly/WB3zjc
[12] C
ogoluegnes, Arnaud; Templier, Thierry; Gregory, Gary; Bazoud, Olivier:
„Spring Batch in Action“, Manning
[13] https://github.com/codecentric/spring-boot-starter-batch-web/wiki/
Initscript-Template
[14] https://github.com/codecentric/spring-boot-starter-batch-web/wiki/
RPM
[15] http://puppetlabs.com/
[16] http://www.getchef.com/
[17] http://www.ansible.com/home
© Software & Support Media GmbH
javamagazin 10 | 2014
7
codecentric AG
Kölner Landstraße 11
40591 Düsseldorf
Tel: +49 (0) 211.9941410
Fax: +49 (0) 211.9941444
E-Mail: [email protected]
www.codecentric.de
blog.codecentric.de
Herunterladen