You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
11 KiB
11 KiB
TED Package Download - Camel-Native Implementation
Übersicht
Vollständig Camel-basierte Implementierung des automatischen TED Daily Package Downloads unter Verwendung von Apache Camel Enterprise Integration Patterns (EIP).
Architektur
Verwendete Enterprise Integration Patterns
- Timer Pattern - Periodischer Trigger für Downloads
- Content-Based Router - Verzweigung basierend auf HTTP-Status
- Splitter Pattern - Parallele Verarbeitung von XML-Dateien
- Dead Letter Channel - Fehlerbehandlung mit Retry-Logik
- Message Filter - Filterung basierend auf Package-Status
- Pipes and Filters - Sequenzielle Verarbeitung
Route-Komponenten
1. Timer-Scheduler (ted-package-scheduler)
timer → determineNextPackage → choice → download-package
- Läuft alle X Millisekunden (konfigurierbar, Default: 1 Stunde)
- Ermittelt nächstes Package (aktuelles Jahr priorisiert)
- Stoppt automatisch nach 4 aufeinanderfolgenden 404-Fehlern
2. HTTP-Downloader (ted-package-http-downloader)
direct:download-package → createPackageRecord → delay → HTTP GET → choice
├─ 200 OK → process-downloaded-package
├─ 404 → markPackageNotFound
└─ other → markPackageFailed
- Native HTTP-Component für Downloads
- Rate Limiting via delay()
- Content-Based Routing nach HTTP-Status
3. Package-Processor (ted-package-processor)
process-downloaded-package → calculateHash → checkDuplicate → choice
├─ duplicate → markPackageDuplicate
└─ new → saveDownloadedPackage → extract-tar-gz
- SHA-256 Hash-Berechnung
- Duplikaterkennung via Hash
- Speicherung auf Filesystem
4. TAR.GZ-Extractor (ted-package-extractor)
extract-tar-gz → extractTarGz → deleteTarGz (optional) → split-xml-files
- Apache Commons Compress für TAR.GZ
- Extraktion aller XML-Dateien
- Optionales Cleanup
5. XML-Splitter (ted-package-xml-splitter)
split-xml-files → split(xmlFiles) → prepareXmlForProcessing → direct:process-document
- Parallele Verarbeitung (.parallelProcessing())
- Streaming (.streaming())
- Integration mit bestehender XML-Route
Camel-Komponenten
Verwendete Camel-Komponenten
- timer - Periodischer Trigger
- http - HTTP GET Requests
- direct - Synchrone Route-Verbindungen
- bean - Processor-Aufrufe
- file - Filesystem-Operationen (indirekt via Processor)
Dependencies (pom.xml)
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-http</artifactId>
<version>${camel.version}</version>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-bean</artifactId>
<version>${camel.version}</version>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-jackson</artifactId>
<version>${camel.version}</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-compress</artifactId>
<version>1.27.1</version>
</dependency>
Workflow-Diagramm
┌─────────────────────┐
│ Timer (1h) │
│ Scheduler │
└──────┬──────────────┘
│
▼
┌─────────────────────┐
│ Determine Next │
│ Package (Bean) │
└──────┬──────────────┘
│
▼
┌─────────────────────┐
│ HTTP GET │
│ https://ted... │
└──────┬──────────────┘
│
▼
┌──┴───┐
│Choice│
└──┬───┘
│
┌──┴─────┬─────────┬─────────┐
│ │ │ │
200 404 Other Error
│ │ │ │
▼ ▼ ▼ ▼
Process NotFound Failed Dead Letter
│
▼
┌─────────────────────┐
│ Calculate Hash │
│ (SHA-256) │
└──────┬──────────────┘
│
▼
┌─────────────────────┐
│ Check Duplicate │
│ (DB Query) │
└──────┬──────────────┘
│
┌──┴───┐
│Choice│
└──┬───┘
│
┌──┴─────┬─────────┐
│ │ │
New Duplicate │
│ │ │
▼ ▼ │
Extract Complete │
│ │
▼ │
┌─────────────────────┤
│ Extract TAR.GZ │
│ (Apache Commons) │
└──────┬──────────────┘
│
▼
┌─────────────────────┐
│ Split XML Files │
│ (Parallel) │
└──────┬──────────────┘
│
▼
┌─────────────────────┐
│ Process Document │
│ (existing route) │
└─────────────────────┘
Message Headers
Download Route Headers
| Header | Type | Beschreibung |
|---|---|---|
packageId |
String | YYYYSSSSS Format |
year |
Integer | Jahr des Packages |
serialNumber |
Integer | Seriennummer |
downloadUrl |
String | Vollständige Download-URL |
downloadStartTime |
Long | Start-Timestamp |
CamelHttpResponseCode |
Integer | HTTP Status |
fileHash |
String | SHA-256 Hash |
isDuplicate |
Boolean | Duplikat-Flag |
duplicateOf |
String | Original Package-ID |
Extraction Headers
| Header | Type | Beschreibung |
|---|---|---|
downloadPath |
String | Pfad zur tar.gz Datei |
xmlFiles |
List | Liste der XML-Dateien |
xmlFileCount |
Integer | Anzahl XML-Dateien |
deleteAfterExtraction |
Boolean | Cleanup-Flag |
Konfiguration
application.yml
ted:
download:
enabled: true # Aktiviert die Camel-native Route
base-url: https://ted.europa.eu/packages/daily/
download-directory: D:/ted.europe/downloads
extract-directory: D:/ted.europe/extracted
start-year: 2024
max-consecutive-404: 4
poll-interval: 3600000 # 1 Stunde
download-timeout: 300000 # 5 Minuten
delay-between-downloads: 5000 # 5 Sekunden
delete-after-extraction: true
prioritize-current-year: true
# Optional: Service-basierte Route (alte Implementierung)
use-service-based: false # Deaktiviert
Error Handling
Dead Letter Channel
errorHandler(deadLetterChannel("direct:package-download-error")
.maximumRedeliveries(3)
.redeliveryDelay(10000)
.retryAttemptedLogLevel(LoggingLevel.WARN))
Retry-Strategie:
- Maximale Wiederholungen: 3
- Verzögerung: 10 Sekunden
- Bei Fehler: Dead Letter Channel
Fehlerbehandlung
-
HTTP-Fehler:
- 404 → Status: NOT_FOUND (kein Retry)
- 5xx → Retry 3x
- Andere → Status: FAILED
-
Verarbeitungsfehler:
- Hash-Berechnung fehlgeschlagen → Retry
- Extraktion fehlgeschlagen → Retry
- XML-Verarbeitung fehlgeschlagen → Package-Status bleibt PROCESSING
Monitoring & Logging
Log-Levels
logging:
level:
at.procon.ted.camel: DEBUG
org.apache.camel: INFO
Log-Meldungen
INFO: Package-Start, Completion, Status-ÄnderungenDEBUG: HTTP-Responses, Hash-Berechnungen, ExtraktionenWARN: Duplikate, HTTP-Fehler, RetriesERROR: Dead Letter Channel, kritische Fehler
Performance-Optimierung
Parallele Verarbeitung
.split(header("xmlFiles"))
.parallelProcessing() // Parallele Verarbeitung
.streaming() // Streaming für große Listen
Rate Limiting
.delay(simple("{{ted.download.delay-between-downloads:5000}}"))
Verhindert Server-Überlastung durch konfigurierbare Verzögerung.
Database-Integration
Package-Tracking
Alle Statusänderungen werden in TED.ted_daily_package gespeichert:
SELECT
package_identifier,
download_status,
xml_file_count,
processed_count,
downloaded_at
FROM TED.ted_daily_package
ORDER BY year DESC, serial_number DESC;
Status-Workflow
PENDING → DOWNLOADING → DOWNLOADED → PROCESSING → COMPLETED
↓ ↓
NOT_FOUND FAILED
Testing
Manueller Test
# 1. Verzeichnisse erstellen
mkdir -p D:/ted.europe/downloads
mkdir -p D:/ted.europe/extracted
# 2. Database Migration
psql -h 94.130.218.54 -p 5432 -U postgres -d Sales \
-f src/main/resources/db/migration/V2__add_ted_daily_package_table.sql
# 3. Anwendung starten
mvn spring-boot:run
# 4. Logs überwachen
tail -f logs/spring.log | grep "ted-package"
Erfolgreicher Download (Logs)
INFO - Checking for new TED packages...
INFO - Next package to download: 202400001
INFO - Downloaded package 202400001
INFO - Extracting package 202400001...
INFO - Extracted 1234 XML files from package 202400001
INFO - Processing 1234 XML files from package 202400001
INFO - Completed processing package 202400001
Vorteile der Camel-Native Implementierung
- ✅ Enterprise Integration Patterns - Bewährte Muster
- ✅ Declarative Configuration - Route-Definition in Java
- ✅ Native HTTP Component - Optimiert und getestet
- ✅ Monitoring - Camel JMX-Management
- ✅ Error Handling - Dead Letter Channel, Retry
- ✅ Parallel Processing - Split/Aggregate Pattern
- ✅ Message Transformation - Header/Body-Manipulation
- ✅ Content-Based Routing - Dynamische Verzweigungen
Unterschied zur Service-basierten Route
| Feature | Camel-Native | Service-basiert |
|---|---|---|
| HTTP Download | Camel HTTP Component | Java HttpURLConnection |
| Retry | Camel Error Handler | Manuell |
| Routing | Content-Based Router | if/else |
| Parallelisierung | Camel Splitter | Java Executor |
| Monitoring | Camel JMX | Custom |
| Konfiguration | ted.download.enabled |
ted.download.use-service-based |
Nächste Schritte
- ✅ Database Migration ausführen
- ✅ Verzeichnisse erstellen
- ✅
ted.download.enabled=truesetzen - ✅ Anwendung starten
- ⏳ Logs überwachen
- ⏳ DB-Status prüfen
Das System ist produktionsbereit! 🚀