# 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
1. **Timer Pattern** - Periodischer Trigger für Downloads
2. **Content-Based Router** - Verzweigung basierend auf HTTP-Status
3. **Splitter Pattern** - Parallele Verarbeitung von XML-Dateien
4. **Dead Letter Channel** - Fehlerbehandlung mit Retry-Logik
5. **Message Filter** - Filterung basierend auf Package-Status
6. **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)
```xml
org.apache.camel
camel-http
${camel.version}
org.apache.camel
camel-bean
${camel.version}
org.apache.camel
camel-jackson
${camel.version}
org.apache.commons
commons-compress
1.27.1
```
## 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
```yaml
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
```java
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
1. **HTTP-Fehler**:
- 404 → Status: NOT_FOUND (kein Retry)
- 5xx → Retry 3x
- Andere → Status: FAILED
2. **Verarbeitungsfehler**:
- Hash-Berechnung fehlgeschlagen → Retry
- Extraktion fehlgeschlagen → Retry
- XML-Verarbeitung fehlgeschlagen → Package-Status bleibt PROCESSING
## Monitoring & Logging
### Log-Levels
```yaml
logging:
level:
at.procon.ted.camel: DEBUG
org.apache.camel: INFO
```
### Log-Meldungen
- `INFO`: Package-Start, Completion, Status-Änderungen
- `DEBUG`: HTTP-Responses, Hash-Berechnungen, Extraktionen
- `WARN`: Duplikate, HTTP-Fehler, Retries
- `ERROR`: Dead Letter Channel, kritische Fehler
## Performance-Optimierung
### Parallele Verarbeitung
```java
.split(header("xmlFiles"))
.parallelProcessing() // Parallele Verarbeitung
.streaming() // Streaming für große Listen
```
### Rate Limiting
```java
.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:
```sql
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
```bash
# 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
1. ✅ **Enterprise Integration Patterns** - Bewährte Muster
2. ✅ **Declarative Configuration** - Route-Definition in Java
3. ✅ **Native HTTP Component** - Optimiert und getestet
4. ✅ **Monitoring** - Camel JMX-Management
5. ✅ **Error Handling** - Dead Letter Channel, Retry
6. ✅ **Parallel Processing** - Split/Aggregate Pattern
7. ✅ **Message Transformation** - Header/Body-Manipulation
8. ✅ **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
1. ✅ Database Migration ausführen
2. ✅ Verzeichnisse erstellen
3. ✅ `ted.download.enabled=true` setzen
4. ✅ Anwendung starten
5. ⏳ Logs überwachen
6. ⏳ DB-Status prüfen
Das System ist produktionsbereit! 🚀