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 opnieuw te proberen fouten (dat wil 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 de voorbeeldpublicatiegebeurtenissen naar een specifieke partitie. Als de fout niet kan worden geprobeerd, is er een configuratieprobleem dat moet worden opgelost.

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

Relevante informatie zoeken in uitzonderingsberichten

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

  • getErrorCondition: de onderliggende AMQP-fout. Zie de Documentatie van AmqpErrorCondition Enum of de OASIS AMQP 1.0-specificatie voor een beschrijving van de fouten.
  • isTransient: een waarde die aangeeft of dezelfde bewerking moet worden uitgevoerd, is mogelijk. 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 Bus voor meer informatie.

Problemen met machtigingen

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

Zie Problemen met verificatie en autorisatie met Event Hubs oplossen voor andere mogelijke oplossingen.

Connectiviteitsproblemen

Time-out bij het maken van verbinding met de service

Probeer de volgende taken 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 de Event Hubs-clients liever behandelen als een singleton, 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 clients overnemen van java.io.Closeable, zodat uw toepassing verantwoordelijk is voor het aanroepen close() wanneer deze klaar is met het gebruik van een client.

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

Verbinding maken 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 ioT Verbinding maken ionString.java-voorbeeld wordt beschreven hoe u een query uitvoert op IoT Hub om een IoT-verbindingsreeks te vertalen in een ioT-verbindingsreeks die kan worden gebruikt met Event Hubs.

Raadpleeg voor meer informatie de volgende artikelen:

Kan geen onderdelen toevoegen aan de verbindingsreeks

Met de verouderde Event Hubs-clients konden klanten onderdelen toevoegen aan de verbindingsreeks 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 verbindingsreeks s in het formulier dat is gepubliceerd door Azure Portal.

"TransportType=AmqpWebSockets" toevoegen

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

"Authentication=Managed Identity" toevoegen

Zie het voorbeeld PublishEventsWithAzureIdentity.java om te verifiëren met Beheerde identiteit.

Bekijk onze verificatie en de Azure SDK-blogpost voor meer informatie over de Azure.Identity bibliotheek.

Logboekregistratie inschakelen en configureren

Azure SDK voor Java biedt een consistent logboekregistratieverhaal voor hulp bij het oplossen van toepassingsfouten en om 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 Overzicht van Azure SDK voor Java en Probleemoplossing voor hulp bij logboekregistratie.

Naast het inschakelen van logboekregistratie kunt u het logboekniveau VERBOSE instellen op of DEBUG inzichten geven 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 logboekregistratievoorbeeld pom.xml in de sectie 'Afhankelijkheden vereist voor Log4j2'.
  2. Voeg log4j2.xml toe aan de map src/main/resources .

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 de logboekregistratie pom.xml in de sectie 'Afhankelijkheden die vereist zijn voor logback'.
  2. Voeg logback.xml toe aan de map src/main/resources .

AMQP-transportlogboekregistratie inschakelen

Als het inschakelen van clientlogboekregistratie niet voldoende is om uw problemen vast te stellen, kunt u logboekregistratie inschakelen naar een bestand in de onderliggende AMQP-bibliotheek, Qpid Proton-J. Qpid Proton-J gebruikt java.util.logging. U kunt logboekregistratie inschakelen door een configuratiebestand te maken met de inhoud die wordt weergegeven in de volgende sectie. U kunt ook instellen welke configuratieopties u wilt instellen proton.trace.level=ALL 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 PN_TRACE_FRM=1 omgevingsvariabele in.

Voorbeeldbestand logging.properties

In het volgende configuratiebestand wordt traceringsniveauuitvoer van Proton-J vastgelegd in 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 logboeken uitsluiten van logboeknamenpakketten zoals com.azure.messaging.eventhubs of com.azure.core.amqp. 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 kunt negeren in ReceiveLinkHandler.
  • 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.