8.4 KiB
MQTT System Changelog
Version 2.0.0 - 2025-10-22
Breaking Changes
1. MQTT-Broker-Port geändert
- Alt: Port
1883 - Neu: Port
42099 - Broker:
mqtt-2.assecutor.de:42099 - Grund: Neuer dedizierter Port für die Produktionsumgebung
2. Konfigurationssystem umgestellt
Die alte app.mqtt.* Konfiguration wurde durch das neue Plugin-System ersetzt.
Entfernte Konfiguration:
app.mqtt.enabled=true
app.mqtt.broker-uri=mqtt://mqtt-2.assecutor.de
app.mqtt.client-id=server-${random.uuid}
app.mqtt.clean-start=false
app.mqtt.session-expiry-interval=86400
app.mqtt.keep-alive=30
app.mqtt.max-inflight=50
app.mqtt.automatic-reconnect=true
app.mqtt.default-qos=2
app.mqtt.default-retained=false
Neue Konfiguration:
# Messaging Plugin Configuration
app.messaging.plugin.type=mqtt
app.messaging.plugin.mqtt.broker.host=mqtt-2.assecutor.de
app.messaging.plugin.mqtt.broker.port=42099
app.messaging.plugin.mqtt.username=app
app.messaging.plugin.mqtt.password=apppwd
app.messaging.plugin.mqtt.client.id=votianlt-server
Neue Features
1. Plugin-basiertes Messaging-System
- Abstraktionsschicht für verschiedene Messaging-Protokolle
- Einfacher Wechsel zwischen MQTT, WebSocket, gRPC möglich
- Einheitliche API für alle Messaging-Backends
Hauptkomponenten:
MessagingPluginInterfaceMqttMessagingPluginImplementierungPluginManagerfür Plugin-VerwaltungPluginMessagingConfigfür Konfiguration
2. Message Envelope System
Alle Nachrichten werden jetzt in Envelopes verpackt:
public class MessageEnvelope {
private String messageId; // UUID
private Instant timestamp; // Zeitstempel
private String topic; // MQTT-Topic
private Object payload; // Eigentliche Nachricht
private boolean requiresAck; // ACK erforderlich?
private int retryCount; // Anzahl Wiederholungen
private Instant expiresAt; // Ablaufzeitpunkt
}
3. Acknowledgment-System
- Automatische ACK-Verwaltung
- Retry-Mechanismus bei fehlenden ACKs
- Konfigurierbare Timeouts und Wiederholungen
public class AcknowledgmentMessage {
private String messageId;
private Instant timestamp;
private String status; // SUCCESS oder FAILED
private String errorMessage;
}
4. Verbesserte Fehlerbehandlung
- Erhöhter Connection-Timeout: 30s → 60s
- Detaillierte Fehlerdiagnose:
TimeoutException: Broker nicht erreichbarUnknownHostException: DNS-FehlerConnectException: Port blockiert
- Automatische Wiederverbindung mit exponentieller Backoff
5. Konfigurierbare Timeouts
Neue Konfigurationsoptionen:
app.messaging.plugin.mqtt.connection.timeout.seconds=60
app.messaging.plugin.mqtt.keep.alive.seconds=60
Entfernte Komponenten
Gelöschte Klassen:
MqttProperties.java- Ersetzt durch Plugin-KonfigurationMqttConfig.java- Nicht mehr benötigt
Grund für Entfernung:
Diese Klassen wurden durch das neue Plugin-System obsolet und waren nicht mehr in Verwendung.
Geänderte Komponenten
1. MqttMessagingPlugin
Datei: src/main/java/de/assecutor/votianlt/messaging/plugin/mqtt/MqttMessagingPlugin.java
Änderungen:
- Connection-Timeout von 30s auf 60s erhöht
- Konfigurierbare Timeout-Parameter hinzugefügt
- Verbesserte Fehlerbehandlung mit spezifischen Exception-Checks
- Detailliertes Logging für Verbindungsprobleme
// Neu: Konfigurierbare Timeouts
private static final String CONFIG_CONNECTION_TIMEOUT = "connection.timeout.seconds";
private static final String CONFIG_KEEP_ALIVE = "keep.alive.seconds";
// Verbesserte Fehlerbehandlung
if (throwable instanceof java.util.concurrent.TimeoutException) {
log.error("[MqttPlugin] Connection timeout - broker may be unreachable");
} else if (throwable.getCause() instanceof java.net.UnknownHostException) {
log.error("[MqttPlugin] Unknown host - DNS resolution failed");
} else if (throwable.getCause() instanceof java.net.ConnectException) {
log.error("[MqttPlugin] Connection refused - broker may be down");
}
2. PluginMessagingConfig
Datei: src/main/java/de/assecutor/votianlt/messaging/config/PluginMessagingConfig.java
Änderungen:
- Verwendet neue Konfigurationsparameter
- Initialisiert Plugin mit korrektem Port (42099)
- Setzt Authentifizierung (username/password)
3. application.properties
Datei: src/main/resources/application.properties
Änderungen:
- Alte
app.mqtt.*Konfiguration entfernt (Zeilen 57-71) - Neue
app.messaging.plugin.mqtt.*Konfiguration verwendet - Port auf 42099 aktualisiert
Architektur-Änderungen
Neue Architektur-Schichten:
Application Layer (Services, Controllers)
↓
MessageDeliveryService (Envelope-Wrapping, Queue-Management)
↓
PluginManager (Plugin-Verwaltung)
↓
MessagingPlugin Interface (Protokoll-Abstraktion)
↓
MqttMessagingPlugin (MQTT-spezifische Implementierung)
↓
HiveMQ MQTT Client
Vorteile der neuen Architektur:
- Protokoll-Unabhängigkeit: Einfacher Wechsel zwischen Messaging-Backends
- Testbarkeit: Mock-Plugins für Tests
- Wartbarkeit: Klare Trennung der Verantwortlichkeiten
- Erweiterbarkeit: Neue Protokolle einfach hinzufügbar
Migration Guide
Server-Migration (bereits durchgeführt):
- ✅ Port auf 42099 geändert
- ✅ Alte Konfiguration entfernt
- ✅ Neue Plugin-Konfiguration aktiviert
- ✅ Timeout erhöht
- ✅ Fehlerbehandlung verbessert
Client-Migration (erforderlich):
Siehe MQTT_MIGRATION_GUIDE.md für detaillierte Anweisungen.
Wichtigste Schritte:
- Port auf 42099 ändern
- Authentifizierung hinzufügen (username:
app, password:apppwd) - Message-Envelope-Format implementieren
- ACK-Handling implementieren
- Timeout auf 60s erhöhen
Kompatibilität
Abwärtskompatibilität:
- ✅ Topic-Struktur unverändert
- ✅ Legacy-Nachrichten werden noch unterstützt
- ⚠️ Neue Clients sollten Envelope-Format verwenden
Vorwärtskompatibilität:
- ✅ Neue Features sind optional
- ✅ Schrittweise Migration möglich
- ✅ Alte und neue Clients können parallel laufen
Testing
Getestete Szenarien:
- ✅ Verbindung zum neuen Broker (mqtt-2.assecutor.de:42099)
- ✅ Authentifizierung mit username/password
- ✅ Subscription zu allen Topics
- ✅ Message-Envelope-Verarbeitung
- ✅ ACK-Handling
- ✅ Automatische Wiederverbindung
- ✅ Timeout-Handling
Test-Logs:
11:29:26.251 [RxComputationThreadPool-1] INFO MqttMessagingPlugin - Connected successfully
11:29:26.414 [RxComputationThreadPool-3] INFO MqttMessagingPlugin - Successfully subscribed to: /ack/server/+
11:29:26.414 [RxComputationThreadPool-4] INFO MqttMessagingPlugin - Successfully subscribed to: /server/+/task_completed
11:29:26.414 [RxComputationThreadPool-5] INFO MqttMessagingPlugin - Successfully subscribed to: /server/+/jobs/assigned
11:29:26.415 [RxComputationThreadPool-6] INFO MqttMessagingPlugin - Successfully subscribed to: /server/+/message
11:29:26.417 [RxComputationThreadPool-7] INFO MqttMessagingPlugin - Successfully subscribed to: /server/+/login
Performance
Verbindungsaufbau:
- Vorher: ~30s bis Timeout bei Fehlern
- Nachher: ~60s bis Timeout, aber schnellere Fehlerdiagnose
Nachrichtendurchsatz:
- Keine Änderung (QoS 2, exactly once)
- Envelope-Overhead: ~200 Bytes pro Nachricht
Bekannte Probleme
Keine bekannten Probleme
Alle Tests erfolgreich durchgeführt.
Nächste Schritte
- Client-Migration: Mobile Apps auf neuen Port und Envelope-Format umstellen
- Monitoring: Metriken für Message-Delivery-Service hinzufügen
- Dokumentation: API-Dokumentation für Envelope-Format erweitern
- Testing: Integration-Tests für verschiedene Fehlerszenarien
Rollback-Plan
Falls Probleme auftreten:
-
Port zurücksetzen:
app.messaging.plugin.mqtt.broker.port=1883 -
Alte Konfiguration wiederherstellen:
MqttProperties.javaaus Git-Historie wiederherstellenMqttConfig.javaaus Git-Historie wiederherstellen- Alte
app.mqtt.*Konfiguration inapplication.propertieseinfügen
-
Server neu starten
Kontakt
Bei Fragen oder Problemen:
- Siehe
MQTT_MIGRATION_GUIDE.mdfür Client-Migration - Siehe
MESSAGING_LAYER.mdfür Architektur-Details - Siehe
CLAUDE.mdfür allgemeine System-Dokumentation