Teilen über


Beheben von Problemen mit Azure Event Hubs

In diesem Artikel werden Techniken zur Fehleruntersuchung, häufig auftretende Fehler im Zusammenhang mit den Typen der Anmeldeinformationen in der Event Hubs-Bibliothek sowie Schritte zur Behebung dieser Fehler behandelt. Zusätzlich zu den allgemeinen Problembehandlungstechniken und Anleitungen, die unabhängig vom Anwendungsfall für Event Hubs gelten, behandeln die folgenden Artikel bestimmte Features der Event Hubs-Bibliothek:

Im restlichen Teil dieses Artikels werden allgemeine Problembehandlungstechniken und Anleitungen behandelt, die für alle Benutzer der Event Hubs-Bibliothek gelten.

Umgang mit Event Hubs-Ausnahmen

Alle Event Hubs-Ausnahmen werden in eine AmqpException eingebunden. Diese Ausnahmen weisen häufig einen zugrunde liegenden AMQP-Fehlercode auf, der angibt, ob ein Fehler wiederholt werden soll. Bei wiederholbaren Fehlern (d. h. amqp:connection:forced oder amqp:link:detach-forced) versuchen die Clientbibliotheken, diesen Fehler auf Basis der Wiederholungsoptionen zu beheben, die beim Instanziieren des Clients angegeben wurden. Folgen Sie zum Konfigurieren der Wiederholungsoptionen dem Beispiel unter Veröffentlichen von Ereignissen in bestimmten Partitionen. Wenn der Fehler nicht wiederholbar ist, besteht ein Konfigurationsproblem, das behoben werden muss.

Die empfohlene Methode zum Lösen der spezifischen Ausnahme, die die AMQP-Ausnahme darstellt, besteht darin, die Event Hubs Messaging Exceptions Anleitungen zu befolgen.

Suchen relevanter Informationen in Ausnahmemeldungen

Eine AmqpException- enthält die folgenden drei Felder, die den Fehler beschreiben:

  • getErrorCondition: Der zugrunde liegende AMQP-Fehler. Eine Beschreibung der Fehler finden Sie in der AmqpErrorCondition Enum-Dokumentation oder der OASIS AMQP 1.0-Spezifikation.
  • isTransient: Ein Wert, der angibt, ob es möglich ist, zu versuchen, denselben Vorgang auszuführen. SDK-Clients wenden die Wiederholungsrichtlinie an, wenn der Fehler vorübergehend ist.
  • getErrorContext-: Enthält die folgenden Informationen zum Ursprung des AMQP-Fehlers:

Häufig auftretende Ausnahmen

amqp:connection:forced und amqp:link:detach-forced

Wenn sich die Verbindung mit Event Hubs im Leerlauf befindet, unterbricht der Dienst nach einiger Zeit die Verbindung zum Client. Dies ist kein Problem, weil die Clients die Verbindung wiederherstellen, wenn ein Dienstvorgang angefordert wird. Weitere Informationen finden Sie unter AMQP-Fehler in Azure Service Bus.

Berechtigungsprobleme

Eine AmqpException mit einer AmqpErrorCondition von amqp:unauthorized-access bedeutet, dass die angegebenen Zugangsdaten es nicht erlauben, Aktionen (Empfangen oder Senden) mit Event Hubs durchzuführen. Um dieses Problem zu beheben, probieren Sie die folgenden Aufgaben aus:

Weitere mögliche Lösungen finden Sie unter Lösen von Authentifizierungs- und Autorisierungsproblemen mit Event Hubs.

Konnektivitätsprobleme

Timeout beim Herstellen einer Verbindung mit dem Dienst

Um Timeoutprobleme zu beheben, gehen Sie wie folgt vor:

Fehler beim TLS/SSL-Handshake

Dieser Fehler kann auftreten, wenn ein abfangender Proxy verwendet wird. Um dies zu überprüfen, empfehlen wir, Tests in Ihrer Hostingumgebung mit deaktiviertem Proxy durchzuführen.

Fehler bei der Socketauslastung

Anwendungen sollten die Event Hubs-Clients vorzugsweise als Singleton behandeln und während ihrer gesamten Lebensdauer eine einzelne Instanz erstellen und verwenden. Diese Empfehlung ist wichtig, da jeder Clienttyp seine Verbindung verwaltet. Wenn Sie einen neuen Event Hubs-Client erstellen, führt er zu einer neuen AMQP-Verbindung, die einen Socket verwendet. Darüber hinaus ist es wichtig, dass Clients von java.io.Closeable erben, damit Ihre Anwendung close() aufruft, wenn sie einen Client nicht mehr verwendet.

Wenn Sie beim Erstellen mehrerer Clients dieselbe AMQP-Verbindung verwenden möchten, können Sie das Flag EventHubClientBuilder.shareConnection() verwenden, auf diesen EventHubClientBuilder verweisen und neue Clients ausgehend von derselben Builder-Instanz erstellen.

Herstellen einer Verbindung unter Verwendung einer IoT-Verbindungszeichenfolge

Da für die Übersetzung einer Verbindungszeichenfolge eine Abfrage des IoT Hub-Diensts erforderlich ist, kann die Event Hubs-Clientbibliothek sie nicht direkt verwenden. Im IoTConnectionString.java Beispiel wird beschrieben, wie Sie IoT Hub abfragen, um eine IoT-Verbindungszeichenfolge in eine zu übersetzen, die mit Event Hubs verwendet werden kann.

Weitere Informationen finden Sie in den folgenden Artikeln:

Der Verbindungszeichenfolge können keine Komponenten hinzugefügt werden

Die veralteten Event Hubs-Clients erlaubten es den Kunden, Komponenten zur Verbindungszeichenfolge hinzuzufügen, die sie aus dem Azure-Portal abgerufen hatten. Die Legacy-Clients befinden sich in den Paketen com.microsoft.azure:azure-eventhubs und com.microsoft.azure:azure-eventhubs-eph. Die aktuelle Generation unterstützt Verbindungszeichenfolgen nur in dem Formular, das vom Azure-Portal veröffentlicht wird.

Hinzufügen von „TransportType=AmqpWebSockets“

Informationen zur Verwendung von Websockets finden Sie im PublishEventsWithSocketsAndProxy.java Beispiel.

Hinzufügen von „Authentication=Managed Identity“

Informationen zur Authentifizierung mit verwalteter Identität finden Sie im Beispiel PublishEventsWithAzureIdentity.java.

Weitere Informationen zur Azure.Identity-Bibliothek finden Sie in unserem Beitrag zur -Authentifizierung und im Blogbeitrag des Azure SDK.

Aktivieren und Konfigurieren der Protokollierung

Azure SDK für Java bietet eine konsistente Logging-Story, um die Fehlersuche bei Anwendungsfehlern zu erleichtern und deren Lösung zu beschleunigen. Die erstellten Protokolle erfassen den Ablauf einer Anwendung, bevor sie den Terminalstatus erreicht, um das Stammproblem zu finden. Richtlinien zur Protokollierung finden Sie unter Konfiguration der Protokollierung im Azure SDK für Java und Übersicht zur Fehlerbehebung.

Zusätzlich zur Aktivierung der Protokollierung bietet das Festlegen der Protokollebene auf VERBOSE oder DEBUG Einblicke in den Zustand der Bibliothek. In den folgenden Abschnitten finden Sie Beispiele für die Konfiguration von log4j2 und logback, um die übermäßigen Meldungen zu reduzieren, wenn die ausführliche Protokollierung aktiviert ist.

Konfigurieren von Log4J 2

Führen Sie die folgenden Schritte aus, um Log4J 2 zu konfigurieren:

  1. Fügen Sie die Abhängigkeiten in Ihrer pom.xml hinzu, indem Sie die Abhängigkeiten aus der pom.xml des Logging-Beispiels verwenden, und zwar im Abschnitt „Für Log4j2 erforderliche Abhängigkeiten“.
  2. Fügen Sie log4j2.xml zu Ihrem src/main/resources-Ordner hinzu.

Logback konfigurieren

Führen Sie die folgenden Schritte aus, um Logback zu konfigurieren:

  1. Fügen Sie die Abhängigkeiten in Ihrer pom.xml hinzu, indem Sie die Abhängigkeiten aus der pom.xml des Logging-Beispiels verwenden, und zwar im Abschnitt „Für Logback erforderliche Abhängigkeiten“.
  2. Fügen Sie logback.xml zu Ihrem Ordner src/main/resources hinzu.

Aktivierung der AMQP-Transportprotokollierung

Wenn die Aktivierung der Client-Protokollierung nicht ausreicht, um Ihre Probleme zu diagnostizieren, können Sie die Protokollierung in eine Datei in der zugrunde liegenden AMQP-Bibliothek, Qpid Proton-J, aktivieren. Qpid Proton-J verwendet java.util.logging. Sie können die Protokollierung aktivieren, indem Sie eine Konfigurationsdatei mit den im nächsten Abschnitt gezeigten Inhalten erstellen. Oder legen Sie proton.trace.level=ALL und die gewünschten Konfigurationsoptionen für die Implementierung von java.util.logging.Handler fest. Die Implementierungsklassen und deren Optionen finden Sie in der Java 8 SDK-Dokumentation unter Package java.util.logging.

Um die Ablaufverfolgung der AMQP-Transportrahmen durchzuführen, setzen Sie die Umgebungsvariable PN_TRACE_FRM=1.

Beispiel für die Datei „logging.properties“

Die folgende Konfigurationsdatei protokolliert die Ablaufverfolgung auf TRACE-Ebene von Proton-J in der Datei proton-trace.log:

handlers=java.util.logging.FileHandler
.level=OFF
proton.trace.level=ALL
java.util.logging.FileHandler.level=ALL
java.util.logging.FileHandler.pattern=proton-trace.log
java.util.logging.FileHandler.formatter=java.util.logging.SimpleFormatter
java.util.logging.SimpleFormatter.format=[%1$tF %1$tr] %3$s %4$s: %5$s %n

Protokollierung reduzieren

Eine Möglichkeit, die Protokollierung zu verringern, besteht darin, die Ausführlichkeit zu ändern. Eine andere Möglichkeit ist das Hinzufügen von Filtern, die Protokolle von Paketen mit Loggernamen wie com.azure.messaging.eventhubs oder com.azure.core.amqp ausschließen. Beispiele finden Sie in den XML-Dateien in den Abschnitten Konfiguration von Log4J 2 und Konfiguration von logback.

Wenn Sie einen Fehler übermitteln, sind die Protokollmeldungen aus Klassen in den folgenden Paketen interessant:

  • com.azure.core.amqp.implementation
  • com.azure.core.amqp.implementation.handler
    • Die Ausnahme besteht darin, dass Sie die onDelivery-Meldung in ReceiveLinkHandlerignorieren können.
  • com.azure.messaging.eventhubs.implementation

Nächste Schritte

Wenn die Richtlinien zur Fehlerbehebung in diesem Artikel nicht helfen, Probleme bei der Verwendung der Azure SDK for Java Client-Bibliotheken zu lösen, empfehlen wir Ihnen, einen Fehler im Azure SDK for Java GitHub Repository zu melden.