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:
- Problemen met azure Event Hubs-producenten oplossen
- Problemen met azure Event Hubs-gebeurtenisprocessor oplossen
- Problemen met prestaties van Azure Event Hubs oplossen
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:
- LinkErrorContext: fouten die optreden in de koppeling voor verzenden of ontvangen.
- SessionErrorContext: fouten die optreden in de sessie.
- AmqpErrorContext: fouten die optreden in de verbinding of een algemene AMQP-fout.
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:
- Controleer of u de juiste verbindingsreeks hebt. Voor meer informatie, zie Een Event Hubs-verbindingsreeks ophalen.
- Zorg ervoor dat uw token voor gedeelde toegangssignatuur (SAS) correct wordt gegenereerd. Zie Toegang tot Event Hubs-resources autoriseren met Shared Access Signaturesvoor meer informatie.
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:
- Controleer of de verbindingsreeks of de volledig gekwalificeerde domeinnaam die is opgegeven bij het maken van de client juist is. Zie Een Event Hubs-verbindingsreeks ophalenvoor meer informatie.
- Controleer de firewall- en poortmachtigingen in uw hostingomgeving en controleer of de AMQP-poorten 5671 en 5762 zijn geopend.
- Zorg ervoor dat het eindpunt is toegestaan via de firewall.
- Gebruik WebSockets, waarmee verbinding wordt gemaakt op poort 443. Zie het PublishEventsWithWebSocketsAndProxy.java voorbeeld voor meer informatie.
- Controleer of uw netwerk specifieke IP-adressen blokkeert. Zie Welke IP-adressen moet ik toestaan voor meer informatie?
- Controleer indien van toepassing de proxyconfiguratie. Zie het PublishEventsWithWebSocketsAndProxy.java voorbeeld voor meer informatie.
- Zie Connectiviteitsproblemen oplossen - Azure Event Hubsvoor meer informatie over het oplossen van problemen met de netwerkverbinding.
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 EventHubClientBuilder
bewaren 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:
- Toegang tot IoT Hub beheren met gedeelde toegangshandtekeningen
- apparaat-naar-cloud-berichten lezen vanaf het ingebouwde eindpunt
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:
- 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'.
- Voeg log4j2.xml toe aan uw src/main/resources map.
Logback configureren
Gebruik de volgende stappen om logback te configureren:
- 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'.
- 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 inReceiveLinkHandler
kunt negeren.
- De uitzondering is dat u het
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.