Delen via


Problemen met Azure Event Hubs oplossen

In dit artikel worden technieken voor foutonderzoek beschreven, veelvoorkomende fouten voor de referentietypen in de Event Hubs-bibliotheek en oplossingen voor deze fouten. Naast de algemene technieken en richtlijnen voor probleemoplossing die van toepassing zijn, ongeacht de use-case van Event Hubs, worden in de volgende artikelen specifieke functies van de Event Hubs-bibliotheek behandeld:

In de rest van dit artikel worden algemene technieken en richtlijnen beschreven die van toepassing zijn op alle gebruikers van de Event Hubs-bibliotheek.

Event Hubs-uitzonderingen verwerken

Alle Event Hubs-uitzonderingen worden verpakt in een AmqpException-. Deze uitzonderingen hebben vaak een onderliggende AMQP-foutcode die aangeeft of een fout opnieuw moet worden geprobeerd. Voor fouten die opnieuw kunnen worden geprobeerd (dat wil gezegd amqp:connection:forced of amqp:link:detach-forced), proberen de clientbibliotheken deze fouten te herstellen op basis van de opties voor opnieuw proberen die zijn opgegeven bij het instantiëren van de client. Als u opties voor opnieuw proberen wilt configureren, volgt u het voorbeeld gebeurtenissen publiceert naar een specifieke partitie. Als de fout niet opnieuw geprobeerd kan worden, is er een configuratieprobleem dat moet worden opgelost.

De aanbevolen manier om de specifieke uitzondering op te lossen die de AMQP-uitzondering vertegenwoordigt, is het volgen van de Event Hubs Messaging-uitzonderingen richtlijnen.

Relevante informatie zoeken in uitzonderingsberichten

Een AmqpException- bevat de volgende drie velden, waarin de fout wordt beschreven:

  • getErrorCondition: de onderliggende AMQP-fout. Zie de AmqpErrorCondition Enum documentatie of de OASIS AMQP 1.0 specvoor een beschrijving van de fouten.
  • isTransient: een waarde die aangeeft of het mogelijk is om dezelfde bewerking opnieuw uit te voeren. SDK-clients passen het beleid voor opnieuw proberen toe wanneer de fout tijdelijk is.
  • getErrorContext: Bevat de volgende informatie over waar de AMQP-fout vandaan komt:

Veelvoorkomende uitzonderingen

amqp:connection:forced and amqp:link:detach-forced

Wanneer de verbinding met Event Hubs inactief is, verbreekt de service de client na enige tijd. Dit probleem is geen probleem omdat de clients een verbinding opnieuw tot stand brengen wanneer een servicebewerking wordt aangevraagd. Zie AMQP-fouten in Azure Service Busvoor meer informatie.

Machtigingsproblemen

Een AmqpException met een AmqpErrorCondition van amqp:unauthorized-access betekent dat de opgegeven inloggegevens niet toestaan om de actie van ontvangen of verzenden met Event Hubs uit te voeren. Probeer de volgende taken om dit probleem op te lossen:

Zie Verificatie- en autorisatieproblemen met Event Hubs-oplossen voor andere mogelijke oplossingen.

Connectiviteitsproblemen

Time-out bij het maken van verbinding met de service

Probeer de volgende stappen om time-outproblemen op te lossen:

TLS/SSL-handshakefouten

Deze fout kan optreden wanneer een onderscheppingsproxy wordt gebruikt. Om dit te controleren, raden we u aan om te testen in uw hostingomgeving waarbij de proxy is uitgeschakeld.

Socketuitputtingsfouten

Toepassingen moeten bij voorkeur de Event Hubs-clients als een singleton behandelen, waarbij één exemplaar wordt gemaakt en gebruikt gedurende de levensduur van hun toepassing. Deze aanbeveling is belangrijk omdat elk clienttype de verbinding beheert. Wanneer u een nieuwe Event Hubs-client maakt, resulteert dit in een nieuwe AMQP-verbinding, die gebruikmaakt van een socket. Daarnaast is het essentieel dat cliënten erven van java.io.Closeable, zodat uw toepassing verantwoordelijk is voor het aanroepen van close() wanneer de applicatie klaar is met het gebruik van een cliënt.

Als u dezelfde AMQP-verbinding wilt gebruiken bij het maken van meerdere clients, kunt u de vlag EventHubClientBuilder.shareConnection() gebruiken, een verwijzing naar die EventHubClientBuilderbewaren en nieuwe clients maken op basis van hetzelfde builder-exemplaar.

Verbinding maken met behulp van een IoT-verbindingsreeks

Omdat voor het vertalen van een verbindingsreeks een query moet worden uitgevoerd op de IoT Hub-service, kan de Event Hubs-clientbibliotheek deze niet rechtstreeks gebruiken. In het IoTConnectionString.java voorbeeld wordt beschreven hoe u een query uitvoert op IoT Hub om een IoT-verbindingsreeks te vertalen in een tekenreeks die kan worden gebruikt met Event Hubs.

Zie de volgende artikelen voor meer informatie:

Kan geen onderdelen toevoegen aan de verbindingsreeks

Met de verouderde Event Hubs-clients konden klanten onderdelen toevoegen aan de verbindingsreeks die is opgehaald uit Azure Portal. De verouderde clients bevinden zich in pakketten com.microsoft.azure:azure-eventhubs en com.microsoft.azure:azure-eventhubs-eph. De huidige generatie ondersteunt alleen verbindingsreeksen in het formulier dat is gepubliceerd door Azure Portal.

"TransportType=AmqpWebSockets" toevoegen

Zie het voorbeeld van het PublishEventsWithSocketsAndProxy.java als u websockets wilt gebruiken.

Authentication=Managed Identity" toevoegen

Zie de voorbeeld-PublishEventsWithAzureIdentity.javaom te verifiëren met Beheerde identiteit.

Raadpleeg voor meer informatie over de Azure.Identity-bibliotheek onze blogpost Authentication en de Azure SDK.

Logboekregistratie inschakelen en configureren

Azure SDK voor Java biedt een consistente logboekfunctie om toepassingsfouten op te lossen en hun oplossing te versnellen. De logboeken die worden geproduceerd, leggen de stroom van een toepassing vast voordat de terminalstatus wordt bereikt om het hoofdprobleem op te sporen. Zie Logboekregistratie configureren in de Azure SDK voor Java en Overzicht van probleemoplossingvoor hulp bij logboekregistratie.

Naast het inschakelen van logboekregistratie biedt het instellen van het logboekniveau op VERBOSE of DEBUG inzicht in de status van de bibliotheek. In de volgende secties ziet u voorbeeldconfiguraties voor log4j2 en logback om de overmatige berichten te verminderen wanneer uitgebreide logboekregistratie is ingeschakeld.

Log4J 2 configureren

Gebruik de volgende stappen om Log4J 2 te configureren:

  1. Voeg de afhankelijkheden in uw pom.xml toe met behulp van de afhankelijkheden uit het voorbeeld van logboekregistratie pom.xmlin de sectie 'Afhankelijkheden die vereist zijn voor Log4j2'.
  2. Voeg log4j2.xml toe aan uw src/main/resources map.

Logback configureren

Gebruik de volgende stappen om logback te configureren:

  1. Voeg de afhankelijkheden in uw pom.xml toe met behulp van de afhankelijkheden uit het voorbeeld van logboekregistratie pom.xmlin de sectie 'Afhankelijkheden vereist voor logback'.
  2. Voeg logback.xml toe aan uw src/main/resources map.

AMQP-transportlogboekregistratie inschakelen

Als het inschakelen van client logging niet voldoende is om uw problemen op te lossen, kunt u logboekregistratie inschakelen naar een bestand in de onderliggende AMQP-bibliotheek, Qpid Proton-J. Qpid-Proton-J maakt gebruik van java.util.logging. U kunt logboekregistratie inschakelen door een configuratiebestand te maken met de inhoud die wordt weergegeven in de volgende sectie. Of stel proton.trace.level=ALL en de gewenste configuratieopties in voor de java.util.logging.Handler-implementatie. Zie Package java.util.logging in de Java 8 SDK-documentatie voor de implementatieklassen en de bijbehorende opties.

Als u de AMQP-transportframes wilt traceren, stelt u de omgevingsvariabele PN_TRACE_FRM=1 in.

Voorbeeld "logging.properties" bestand

In het volgende configuratiebestand wordt TRACE-niveau-output van Proton-J gelogd naar het proton-trace.log-bestand .

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

Logboekregistratie beperken

Een manier om logboekregistratie te verminderen, is door de uitgebreidheid te wijzigen. Een andere manier is om filters toe te voegen die logs uitsluiten van pakketten met loggernamen zoals com.azure.messaging.eventhubs of com.azure.core.amqp. Voor voorbeelden, zie de XML-bestanden in de secties Log4J 2 configureren en Logback configureren.

Wanneer u een fout verzendt, zijn de logboekberichten van klassen in de volgende pakketten interessant:

  • com.azure.core.amqp.implementation
  • com.azure.core.amqp.implementation.handler
    • De uitzondering is dat u het onDelivery bericht in ReceiveLinkHandlerkunt negeren.
  • com.azure.messaging.eventhubs.implementation

Volgende stappen

Als de richtlijnen voor probleemoplossing in dit artikel niet helpen bij het oplossen van problemen wanneer u de Azure SDK voor Java-clientbibliotheken gebruikt, raden we u aan een probleem op te slaan in de Azure SDK voor Java GitHub-opslagplaats.