Job Chain
Abfolge abhaengiger Jobs mit Bedingungen und Kalendern.
Periodische Verarbeitung mit Jobketten, Abhaengigkeiten, Zeitfenstern, Wiederanlauf, Kontrolltabellen und Abschlussberichten.
Batch-Verarbeitung wirkt altmodisch, ist aber in vielen Unternehmen der Ort, an dem grosse Mengen fachlich verbindlich verarbeitet werden. Jobs laufen nachts, am Monatsende oder nach externen Dateiankuenften.
Die Logik steckt nicht nur im Programmcode, sondern in Jobketten, Kalendern, Abhaengigkeiten, Kontrolltabellen, Datei-Namenskonventionen, Exit-Codes und manuellen Wiederanlaufanweisungen.
Modernisierung bedeutet, diese Semantik explizit zu machen. Erst wenn Input, Output, Restart, fachliche Teilbarkeit und Monitoring klar sind, kann man Batch nach Spring Batch, Kubernetes CronJobs, Workflow Engines oder Event-getriebene Verarbeitung ueberfuehren.
Abfolge abhaengiger Jobs mit Bedingungen und Kalendern.
Faehigkeit, nach Fehlern ab einer sicheren Stelle weiterzulaufen.
Technischer oder fachlicher Fortschrittsmarker.
Zeitfenster, in dem Verarbeitung abgeschlossen sein muss.
Die Beispiele sind bewusst nicht minimalistisch. Sie zeigen typische Artefakte, die man in echten Legacy-Analysen findet: Schnittstellenverträge, Containerkonfiguration, SQL/PL-SQL, Jobdefinitionen, Queue-Regeln oder Adaptercode.
job: BILLING_MONTHLY_CLOSE
calendar: business-day-last-of-month
predecessors:
- POLICY_DAILY_CLOSE
- PAYMENT_IMPORT_DONE
successors:
- DWH_BILLING_EXPORT
- ARCHIVE_INVOICE_PDF
sla:
mustFinishBefore: "05:30"
restart:
checkpointTable: BATCH_CONTROL
restartFromLastSuccessfulStep: true
@Bean
public Step invoiceCloseStep(JobRepository jobRepository, PlatformTransactionManager tx) {
return new StepBuilder("invoiceCloseStep", jobRepository)
.<InvoiceCandidate, ClosedInvoice>chunk(500, tx)
.reader(invoiceCandidateReader())
.processor(invoiceCloseProcessor())
.writer(closedInvoiceWriter())
.faultTolerant()
.retry(TransientDatabaseException.class)
.retryLimit(3)
.build();
}
CREATE TABLE BATCH_CONTROL (
JOB_NAME VARCHAR2(80) NOT NULL,
BUSINESS_DATE DATE NOT NULL,
LAST_STEP VARCHAR2(80),
LAST_KEY VARCHAR2(120),
STATUS VARCHAR2(20),
UPDATED_AT TIMESTAMP,
PRIMARY KEY (JOB_NAME, BUSINESS_DATE)
);
| Aspekt | Beschreibung |
|---|---|
| Fachliches Risiko | Unklare Verantwortung fuer Tagesabschluss fuehrt zu widerspruechlichen Entscheidungen zwischen Alt- und Neusystem. |
| Technisches Risiko | Control-M/Autosys und angrenzende Komponenten werden isoliert betrachtet; Laufzeitkopplung bleibt verborgen. |
| Betriebsrisiko | Fehlerkanal, Monitoring, Restart oder manuelle Klaerung sind nicht ausreichend dokumentiert. |
| Migrationsrisiko | Neue Architektur uebernimmt Daten oder Schnittstellen, ohne fachliche Invarianten und historische Sonderfaelle abzusichern. |
| Pattern | Einsatz in diesem System |
|---|---|
| Strangler Fig Pattern | Neue Funktionalitaet vor das Altsystem setzen und Altanteile schrittweise herausloesen. |
| Anti-Corruption Layer | Altbegriffe, technische Codes und Datenformate vom neuen Domänenmodell trennen. |
| Facade | Komplexe Legacy-Operationen hinter klaren fachlichen Use-Case-Methoden kapseln. |
| Adapter | Protokolle und Formate wie SOAP, MQ, Copybook, SQL oder File in Ports uebersetzen. |
| Golden Master Test | Bestehendes Verhalten mit Referenzdaten erfassen und gegen neue Implementierung vergleichen. |
Entwerfe fuer einen Monatsabschluss eine Jobkette mit Input, Output, Abhaengigkeiten, Returncodes, Kontrollsummen, Restartpunkt und Fachfreigabe. Markiere, was beim Wechsel auf Kubernetes CronJobs verloren gehen koennte.