Enterprise-ready production-ready Java batch applications powered by Spring Boot

Keine Kommentare

Dieser Post stellt ein neues Projekt vor, das wir aufgestellt haben – unser eigener Spring Boot Starter für Spring Batch: spring-boot-starter-batch-web.
Spring Boot ist ein neues Projekt im Spring-Ökosystem, das dabei hilft, Spring-Anwendungen schnell auf Convention-over-configuration-Art zu entwickeln. Dabei zieht man die Starter einfach als Dependency an, und schon wird die entsprechende Funktionalität automatisch konfiguriert.
Apropos Starter, ja, es gibt bereits einen Starter für Spring Batch, und der ist gut, wenn man Jobs standalone laufen lassen möchte. Unsere Erfahrung sagt uns aber, dass in verteilten Enterprise-Umgebungen ein Batch-Server mit einem http – Endpoint für die Kommunikation passender ist als Jobs standalone laufen zu lassen. Glücklicherweise ist Spring Boot leicht zu verwenden UND leicht zu erweitern, und genau das machen wir hier. Dies ist kein Spielprojekt, wir werden es in Produktion verwenden, und das können Sie auch!

Also, welche Ziele haben wir mit diesem Projekt?

  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.
  3. Die Lösung sollte allgemein benötigte Funktionalität, die wir sonst bei jedem Kunden neu entwickelt haben, automatisch beinhalten.

Unsere favorisierte Architektur / Unternehmensintegration

In Enterprise-Umgebungen gibt es meistens einen externen Scheduler, der häufig für Jobs in der Mainframe- und der verteilten Welt zuständig ist. Unser favorisierter Ansatz, diese Welten zu verbinden, ist die Verwendung von synchroner REST-Kommunikation via http. Wir bevorzugen dabei kleine Batch-Anwendungen, die jeweils höchstens eine Hand voll Jobs beinhalten, um Changes und Updates nicht zu aufwändig werden zu lassen. Diese Architektur werden wir in einem folgenden Blog-Post noch genauer erläutern.
spring-boot-starter-batch-web bietet einen Operations-REST-Endpoint mit der Möglichkeit, Jobs zu starten und zu stoppen, den aktuellen Status eines Jobs zu erfragen und das Log-File zu einem Job-Lauf zu übermitteln. Ein weiterer Monitoring-REST-Endpoint bietet die Funktionalität zu ermitteln, welche Jobs auf diesem Server deployed sind und welche Jobs gerade laufen, außerdem können detaillierte Informationen zu jeder JobExecution abgerufen werden. Man wird selten mehr Funktionalität benötigen.

Einfache Verwendbarkeit

Jeder Entwickler sollte sich auf seine Kernaufgabe konzentrieren können – Jobs schreiben. Bei Verwendung unseres Starters gibt es keine Notwendigkeit, die Batch-Infrastruktur aufzubauen, keine Notwendigkeit, von irgendetwas zu erben, keine Notwendigkeit, einen Server aufzusetzen – ja, richtig, Spring Boot bringt einen embedded Servlet-Container mit. Beim Aufsetzen eines Batch-Projekts muss man nur noch folgende Dinge tun:

  1. Datenbankverbindung via Properties angeben (wenn man das nicht macht, bekommt man eine In-Memory-Datenbank).
  2. Einfache Log-Konfiguration hinzufügen.
  3. Spring Boot Maven Plugin in der pom.xml angeben.
  4. Spring Boot Main Class erzeugen.

Dann können Jobs in XML oder JavaConfig geschrieben werden, deren Konfiguration an bestimmten Stellen im Klassenpfad liegen muss (überschreibbar via Properties). Zum Abschluss kann mit mvn package ein Spring Boot Fat Jar erzeugt und die Anwendung via java -jar xxx.jar gestartet werden. Das ist’s, der Batch-Server läuft, mit der kompletten Infrastruktur, den REST-Endpoints und natürlich den Jobs. Mehr Informationen gibt es auf unserer Getting Started – Page.

Allgemein benötigte Funktionalität

Es gibt einige Dinge, die wir bei jedem Kunden immer wieder auf die gleiche Art entwickeln. Hier wird diese allgemein benötigte Funktionalität automatisch durch den Spring Boot Starter. konfiguriert, ohne dass man etwas tun muss, keine Anpassung am Job, kein Erben, keine Konfiguration.
Neben den REST-Endpoints ist das wichtigste wohl die Log-File-Separation. Wenn wir Jobs starten, wollen wir nicht, dass alle Log-Statements in einem großen Log-File landen, ohne die Möglichkeit, sauber auseinanderhalten zu können, was wozu gehört. Wir wollen ein Log-File für jeden Joblauf, mit einem netten Header, der uns noch die Job-Parameter ausgibt, und einem Protokoll, das alle wichtigen Daten des Laufs zusammenfasst. Und wir wollen, dass dieses Log-File einfach zugreifbar ist, damit es von externen Systemen und Benutzern heruntergeladen werden kann.

Und was kommt jetzt?

Wir haben bereits die Version 1.0.0.RELEASE nach Maven Central veröffentlicht.
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-starter-batch-web</artifactId>
<version>1.0.0.RELEASE</version>

Jetzt freuen wir uns auf Feedback! Wir haben die Apache 2.0 – Lizenz gewählt, so dass jeder mit der Bibliothek machen kann, was er will.
Und natürlich haben wir noch einige Dinge in der Pipeline, so planen wir automatischen Support für den JSR-352, sobald Spring 3.0 veröffentlich ist, und wir planen transaktionssicheren Support für fachliche Zähler und Metriken in der nahen Zukunft.

Tobias Flohre

Tobias Flohre arbeitet als Senior-Softwareentwickler/Architekt bei der codecentric AG. Seine Schwerpunkte sind Java-Enterprise-Anwendungen und Architekturen mit JavaEE/Spring. Er ist Autor diverser Artikel und schreibt regelmäßig Blogbeiträge zu den Themen Architektur und Spring. Zurzeit beschäftigt er sich mit Integrations- und Batch-Themen im Großunternehmen sowie mit modernen Webarchitekturen.

Share on FacebookGoogle+Share on LinkedInTweet about this on TwitterShare on RedditDigg thisShare on StumbleUpon

Kommentieren

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.