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-producent 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 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:
- 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 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:
- Controleer of u de juiste verbindingsreeks hebt. Zie Een verbindingsreeks voor Event Hubs ophalen voor meer informatie.
- Zorg ervoor dat uw SAS-token (Shared Access Signature) correct is gegenereerd. Zie Toegang tot Event Hubs-resources autoriseren met Shared Access Signatures voor meer informatie.
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:
- Controleer of de verbindingsreeks of volledig gekwalificeerde domeinnaam die is opgegeven bij het maken van de client juist is. Zie Een verbindingsreeks voor Event Hubs ophalen voor 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 voorbeeld PublishEventsWithWebSocketsAndProxy.java 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 voorbeeld PublishEventsWithWebSocketsAndProxy.java voor meer informatie.
- Zie Connectiviteitsproblemen oplossen - Azure Event Hubs voor 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 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 EventHubClientBuilder
bewaren 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:
- Toegang tot IoT Hub beheren met Shared Access Signatures
- Apparaat-naar-cloud-berichten lezen van het geïntegreerde eindpunt
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:
- 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'.
- Voeg log4j2.xml toe aan de map src/main/resources .
Logback configureren
Gebruik de volgende stappen om logback te configureren:
- 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'.
- 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 inReceiveLinkHandler
.
- 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.