Golden-Master-Snapshots erfassen stabile Business-Ausgaben. H2-Integrationstests prüfen das reale Schema und alle JDBC-DAO-Namen. Unit Tests decken Happy Paths, Grenzfälle und Provider-/Datenfehler ab. Erst danach werden ACL, Strangler und Parallel Run eingesetzt.
Vom Enterprise-Monolithen zur kontrollierten Spring-Boot-Migration
Diese Referenz beschreibt nicht zwei Legacy-Systeme, sondern eine einzige Ausgangsbasis und die Sicherheitsmechanismen für eine schrittweise Ablösung.
1. Enterprise-Legacy als Ausgangspunkt
Die Legacy-Anwendung modelliert sechs fachlich unterschiedliche, aber absichtlich schlecht getrennte Abläufe. Sie mischt Validierung, Preis- und Steuerberechnung, Datenbankzugriffe, Remote Calls, JMS, Audit und Event-Erzeugung innerhalb großer EJB-Transaktionen.
| Klasse | Fachliche Verantwortung | Typische Altlast |
|---|---|---|
| OrderProcessingMonsterBean | Order Intake bis Shipment | Remote Calls und viele Tabellen in einer Transaktion |
| BillingRunMonsterBean | Invoice, Collection, Dunning, Ledger | Batch und Online-Logik vermischt |
| CustomerContractMonsterBean | Customer Master und Contract Lifecycle | Stringly Typed Maps und Replace-Updates |
| InventoryReplenishmentMonsterBean | Reorder, Budget und Transport | Bestell- und Lagerlogik gekoppelt |
| ReturnsAndRefundMonsterBean | Return, Restocking, Refund | Payment, Stock und Shipment gemeinsam |
| EndOfDaySettlementMonsterBean | Reconciliation und Day Close | Globale Locks und erzwungener Abschluss |
2. Konsistentes Datenmodell
DAO-SQL, JPA-Tabellennamen und Schema verwenden dieselben Namen: CUSTOMERS, ORDERS, ORDER_LINES, AUDIT_LOG, OUTBOX_EVENT und BATCH_CONTROL. Der reservierte Tabellenname ORDER wurde entfernt.
- ACL: mutable SOAP-Daten werden in das moderne Domain-Modell übersetzt.
- Strangler: deterministischer Traffic Split, Shadow-Aufruf und kontrollierter Fallback.
- Parallel Run: Legacy- und Modern-Ergebnisse werden feldweise mit Geldtoleranz verglichen.
- Restartable Batch: Checkpoints, Chunk-Limits, Skip und Dead Letter ermöglichen sichere Datenmigration.
5. Moderne Runtime
Der moderne Pfad speichert Order und Outbox Event in einer Transaktion. Ein Publisher claimt fällige Zeilen per FOR UPDATE SKIP LOCKED, veröffentlicht mit Kafka, markiert erfolgreiche Events als SENT und plant Fehler als RETRY oder endgültig FAILED.
@Transactional
public Result place(Command command) {
orders.save(order);
outbox.save(event); // Transactional Outbox Pattern
}- Characterization und Schema Tests sind grün.
- Legacy und Modern bestehen ihr 80-%-Coverage-Gate.
- Parallel Run zeigt keine kritische Abweichungsrate oberhalb der Freigabeschwelle.
- Fallback bleibt während der Beobachtungsphase aktiv.
- Legacy-Decommission erfolgt erst nach fachlicher, technischer und regulatorischer Freigabe.