Dies ist eine von mir an der Unimedizin Mainz entwickelte ETL-Strecke. Die hier gezeigte Version entspricht der Arbeit von 40h im Rahmen meines Abschlussprojekts.
  • Java 99.2%
  • Dockerfile 0.8%
Find a file
2026-02-03 11:24:54 +01:00
gradle/wrapper initial 2026-01-19 16:22:14 +01:00
src/main fix: use code of correct branch for v1 2026-02-03 11:24:54 +01:00
.gitignore initial 2026-01-19 16:22:14 +01:00
build.gradle initial 2026-01-19 16:22:14 +01:00
Dockerfile initial 2026-01-19 16:22:14 +01:00
gradlew initial 2026-01-19 16:22:14 +01:00
gradlew.bat initial 2026-01-19 16:22:14 +01:00
README.md fix: use code of correct branch for v1 2026-02-03 11:24:54 +01:00
settings.gradle initial 2026-01-19 16:22:14 +01:00

dacapo2cbio

Dies ist der Programmcode einer ETL-Strecke, die ich im Rahmen meines Abschlussprojekts an der Unimedizin Mainz erstellt habe. Standortspezifische Dateien und Konfigurationen wie bspw. CI und Proxy sowie Namen wurden entfernt.

Zum Projekt

Deployment

Konfiguration

Die Konfiguration der Anwendung erfolgt über eine zentrale Konfigurationsdatei: "application.yaml" oder über Umgebungsvariablen. Umgebungsvariablen werden komplett groß geschrieben und verwenden "_" statt ".". Bei Verwendung einer Engine mit Unterstützung
für Secrets (Bspw. Podman oder Kubernetes) sollte das Bearer-Token als Secret über eine Umgebungsvariable gesetzt werden.

Die wichtigsten Werte werden in der folgenden Tabelle erläutert. Weitere Werte finden sich in der Spring Batch Dokumentation.
Pflicht-Werte sind fett markiert. Für alle weiteren Werte werden bei Nicht-Setzen getestete Standards verwendet,
die unter /src/main/resources/application.yml gesetzt sind.

Key Funktion
spring.application.name Name der Instanz
logging.level.ROOT Logging Level der Instanz
batch.chunkSize Größe der chunks (Anzahl der Datensätze, die in einem Batch transferiert werden)
dacapo.cert Pfad des CA-Zertifikats
dacapo.api URL der DaCapo-API
dacapo.bearer Bearer-Token der DaCapo-Api
dacapo.since lädt nur Daten mit Änderung nach diesem Daten. Bei Fehlen Fullload

Monitoring

Key Funktion
management.prometheus.metrics.export.pushgateway.enabled Aktiviert das Senden von Metriken an ein Prometheus-Pushgateway
management.prometheus.metrics.export.pushgateway.address Addresse des Prometheus-Pushgateways

Run

# with Podman (recommended)
podman run \
    --volume /path/to/ca.crt:/config/ca.crt \
    --volume ./application.yml:/config/application.yml \
    --volume ./projects/:/tmp/ \
    dacapo2cbio:latest
# with docker
docker run \
    --volume /path/to/ca.crt:/config/ca.crt \
    --volume ./application.yml:/config/application.yml \
    --volume ./projects/:/tmp/ \
    dacapo2cbio:latest

Schedule

Für die geplante regelmäßige Ausführung gibt es mehrere Optionen:

  • cron
  • systemd-timer
  • kubernetes-scheduler

Je nach Engine wird die Nutzung des Kubernetes-Schedulers oder des Systemd-Timers empfohlen.

systemd

Diese Methode setzt das Vorhandensein eines systemd-Service vom Typ oneshot voraus und empfiehlt sich besonders in Kombination mit Podman Qadlet. Ein solcher Service kann aber auch für docker erstellt werden. Eine Anleitung zum Erstellen des Service befindet sich in der Dokumentation für Podman Qadlet und in der Dokumentation für systemd.

Für den Timer muss folgende Datei unter /etc/systemd/system/name_des_service.timer erstellt werden (bei rootless Pfad anpassen).

[Unit]
Description=Beispiel fuer einen dacapo2cbio-Timer
[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true
[Install]
WantedBy=timers.target

Dieser Timer wird täglich um 2 Uhr ausgeführt. Wurde eine Ausführung verpasst, wird sie nachgeholt.

# neu einlesen des Timers
sudo systemctl daemon-reload

# aktivieren des Timers
sudo systemctl enable --now name_des_service.timer

# deaktivieren des Timers
sudo systemctl disable --now name_des_service

# anzeigen von Status und Logs
systemctl status name_des_service.timer
systemctl status name_des_service
journalctl -xeu name_des_service

cronjob (empfohlen mit Kubernetes)

In Kubernetes kann ein CronJob über die API batch/v1 erstellt werden. Es wird die deklarative Konfiguration über YAML empfohlen.

Eine Beispiel:

apiVersion: batch/v1
kind: CronJob
metadata:
  name: "dacapo2cbio"
  namespace: "example"
spec:
  schedule: "0 2 * * *"
  suspend: false
  concurrencyPolicy: Forbid
  failedJobsHistoryLimit: 5
  successfulJobsHistoryLimit: 2
  startingDeadlineSeconds: 300
  jobTemplate:
    spec:
      backoffLimit: 0
      parallelism: 1
      completions: 1
      template:
        spec:
          restartPolicy: Never
          containers:
          - name: dacapo2cbio
            image: dacapo2cbio:latest
            imagePullPolicy: IfNotPresent
            resources:
              requests:
                memory: "500Mi"
                cpu: "100m"
              limits:
                memory: "2000Mi"
                cpu: "500m"
            envFrom:
              - secretRef:
                  name: dacapo-bearer
            volumeMounts:
            - name: ca
              mountPath: /config
              subPath: ca.crt
            - name: spring-application-config
              mountPath: /config
              subPath: application.yaml
          volumes:
          - name: ca
            configMap:
              name: klinik-ca
          - name: spring-application-config
            configMap:
              name: sap2diz-base