Aracılığıyla paylaş


Azure Event Hubs sorunlarını giderme

Bu makale hata araştırma tekniklerini, Event Hubs kitaplığındaki kimlik bilgisi türleri için yaygın hataları ve bu hataları düzeltmeye yönelik azaltma adımlarını kapsar. Event Hubs kullanım örneğinden bağımsız olarak geçerli olan genel sorun giderme tekniklerine ve kılavuzuna ek olarak, aşağıdaki makaleler Event Hubs kitaplığının belirli özelliklerini kapsar:

Bu makalenin geri kalanı, Event Hubs kitaplığının tüm kullanıcıları için geçerli olan genel sorun giderme tekniklerini ve yönergelerini kapsar.

Event Hubs istisnalarını yönetme

Tüm Event Hubs özel durumları bir AmqpExceptioniçinde sarılır. Bu özel durumlar genellikle bir hatanın yeniden denenip denenmeyeceğini belirten temel amqp hata koduna sahiptir. Yeniden denenebilir hatalar için (amqp:connection:forced veya amqp:link:detach-forced), istemci kitaplıkları istemci örneği oluşturulurken belirtilen yeniden deneme seçeneklerine göre bu hatalardan kurtulmaya çalışır. Yeniden deneme seçeneklerini yapılandırmak için örnek olaylarınıbelirli bir bölüme yayınlamayı takip edin. Hata yeniden denenemezse, çözülmesi gereken bir yapılandırma sorunu vardır.

AMQP özel durumunun temsil ettiği özel durumu çözmenin önerilen yolu Event Hubs Mesajlaşma Özel Durumları yönergelerini izlemektir.

Özel durum iletilerinde ilgili bilgileri bulma

AmqpException, hatayı açıklayan aşağıdaki üç alanı içerir:

  • getErrorCondition: Temel alınan AMQP hatası. Hataların açıklaması için AmqpErrorCondition Enum belgelerine veya OASIS AMQP 1.0 belirtimlerinebakın.
  • isTransient: Aynı işlemi gerçekleştirmeye çalışmanın mümkün olup olmadığını gösteren bir değerdir. SDK istemcileri, hata geçici olduğunda yeniden deneme ilkesini uygular.
  • getErrorContext: AMQP hatasının nereden kaynaklandığı hakkında aşağıdaki bilgileri içerir:

Sık karşılaşılan özel durumlar

amqp:connection:forced ve amqp:link:detach-forced

Event Hubs bağlantısı boşta olduğunda, hizmet bir süre sonra istemcinin bağlantısını keser. İstemciler bir hizmet işlemi istendiğinde yeniden bağlantı kurduğundan bu sorun sorun değil. Daha fazla bilgi için bkz. Azure Service BusAMQP hataları.

İzin sorunları

AmqpException, bir içeren amqp:unauthorized-access, sağlanan kimlik bilgilerinin Event Hubs ile herhangi bir eylemi (alma veya gönderme) gerçekleştirmeye izin vermediğini gösterir. Bu sorunu çözmek için aşağıdaki görevleri deneyin:

Diğer olası çözümler için bkz. Event Hubsile ilgili kimlik doğrulama ve yetkilendirme sorunlarını giderme.

Bağlantı sorunları

Hizmete bağlanırken zaman aşımı

Zaman aşımı sorunlarını çözmek için aşağıdaki görevleri deneyin:

TLS/SSL el sıkışma hataları

Araya giren bir ara sunucu kullanıldığında bu hata oluşabilir. Doğrulamak için, barındırma ortamınızda ara sunucu devre dışı bırakılmış olarak test yapmanızı öneririz.

Soket tükenme hataları

Uygulamalar Event Hubs istemcilerini tekil olarak ele alıp uygulamalarının ömrü boyunca tek bir örnek oluşturmayı ve kullanmayı tercih etmelidir. Her istemci türü kendi bağlantısını yönettiğinden bu öneri önemlidir. Yeni bir Event Hubs istemcisi oluşturduğunuzda bu, yuva kullanan yeni bir AMQP bağlantısına neden olur. Ayrıca, istemcilerin java.io.Closeable'den devralması önemlidir, bu nedenle uygulamanızın istemciyi kullanmayı bitirdiğinde close() çağırmaktan sorumlu olması gerekir.

Birden çok istemci oluştururken aynı AMQP bağlantısını kullanmak için EventHubClientBuilder.shareConnection() bayrağını kullanabilir, o EventHubClientBuilder'e bir başvuru tutabilir ve aynı oluşturucu örneğiyle yeni istemciler oluşturabilirsiniz.

IoT bağlantı dizesi kullanarak bağlanma

Bağlantı dizesini çevirmek için IoT Hub hizmetinin sorgulanması gerektiğinden Event Hubs istemci kitaplığı bunu doğrudan kullanamaz. IoTConnectionString.java örneği, IoT bağlantı dizesini Event Hubs ile kullanılabilecek bir dizeye çevirmek için IoT Hub'ın nasıl sorgulandığını açıklar.

Daha fazla bilgi için aşağıdaki makalelere bakın:

Bağlantı dizesine bileşen eklenemez

Eski Event Hubs istemcileri, müşterilerin Azure portalından alınan bağlantı dizesine bileşen eklemesine izin verdi. Eski istemciler com.microsoft.azure:azure-eventhubs ve com.microsoft.azure:azure-eventhubs-ephpaketlerindedir. Geçerli nesil yalnızca Azure portalı tarafından yayımlanan formda bağlantı dizelerini destekler.

"TransportType=AmqpWebSockets" ekleme

Web yuvalarını kullanmak için PublishEventsWithSocketsAndProxy.java örneğine bakın.

"Authentication=Managed Identity" ekle

Yönetilen Kimlik ile kimlik doğrulaması yapmak için örnek PublishEventsWithAzureIdentity.javabakın.

Azure.Identity kitaplığı hakkında daha fazla bilgi için Kimlik Doğrulaması ve Azure SDK blog gönderimize göz atın.

Günlük kaydını etkinleştirme ve yapılandırma

Java için Azure SDK, uygulama hatalarını gidermeye ve bunların çözümünü hızlandırmaya yardımcı olmak için tutarlı bir günlük hikayesi sunar. Oluşturulan günlükler, kök sorunun bulunmasına yardımcı olmak için terminal durumuna ulaşmadan önce uygulamanın akışını yakalar. Günlüğe kaydetme hakkında yönergeler için bkz. Java için Azure SDK'da günlüğe kaydetmeyi yapılandırma ve Sorun gidermeye genel bakış.

Günlüğü etkinleştirmeye ek olarak, günlük seviyesini VERBOSE veya DEBUG olarak ayarlamak kütüphanenin durumu hakkında içgörüler sağlar. Aşağıdaki bölümlerde, ayrıntılı kayıt etkinleştirildiğinde aşırı iletileri azaltmak amacıyla örnek log4j2 ve logback yapılandırmaları verilmiştir.

Log4J 2'yi yapılandırma

Log4J 2'yi yapılandırmak için aşağıdaki adımları kullanın:

  1. "Log4j2 için gereken bağımlılıklar bölümünde, günlüğe kaydetme örneği pom.xmliçindekileri kullanarak, pom.xml içindeki bağımlılıkları ekleyin."
  2. src/main/resources klasörünüze log4j2.xml ekleyin.

Geri kaydetmeyi yapılandırma

Geri kaydetmeyi yapılandırmak için aşağıdaki adımları kullanın:

  1. "Logback için gereken bağımlılıklar" bölümündeki günlük kaydı örneği pom.xml'yi kullanarak pom.xml'e bağımlılıkları ekleyin.
  2. src/main/resources klasörünüze logback.xml ekleyin.

AMQP aktarım günlüğünü etkinleştir

İstemci günlüğünü etkinleştirmek sorunlarınızı tanılamak için yeterli değilse, altta yatan AMQP kütüphanesinde bir dosyaya günlüğe kaydetmeyi etkinleştirebilirsiniz Qpid Proton-J. Qpid Proton-J java.util.loggingkullanır. Sonraki bölümde gösterilen içeriklerle bir yapılandırma dosyası oluşturarak günlüğü etkinleştirebilirsiniz. Veya proton.trace.level=ALL ve java.util.logging.Handler uygulaması için istediğiniz yapılandırma seçeneklerini ayarlayın. Uygulama sınıfları ve seçenekleri için Java 8 SDK belgelerindeki java.util.logging paketi bölümüne bakınız.

AMQP aktarım çerçevelerini izlemek için PN_TRACE_FRM=1 ortam değişkenini ayarlayın.

Örnek "logging.properties" dosyası

Aşağıdaki yapılandırma dosyası, TRACE düzeyinde çıktıları Proton-J'den proton-trace.log dosyasına kaydeder.

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

Günlük kaydını azalt

Günlüğe kaydetmeyi azaltmanın bir yolu verbositenin düzeyini değiştirmektir. Başka bir yol, günlükleri com.azure.messaging.eventhubs veya com.azure.core.amqpgibi günlükçü adları paketlerinin dışında tutan filtreler eklemektir. Örnekler için, Log4J 2'yi Yapılandırma ve Logback'i Yapılandırma bölümlerindeki XML dosyalarına bakın.

Bir hata gönderdiğinizde, aşağıdaki paketlerdeki sınıflardan gelen günlük iletileri ilginçtir:

  • com.azure.core.amqp.implementation
  • com.azure.core.amqp.implementation.handler
    • İstisna, onDelivery'deki ReceiveLinkHandler mesajını görmezden gelebileceğinizdir.
  • com.azure.messaging.eventhubs.implementation

Sonraki adımlar

Bu makaledeki sorun giderme kılavuzu, Java istemci kitaplıkları için Azure SDK'sını kullanırken karşılaşabileceğiniz sorunları çözmeye yardımcı olmazsa, Azure SDK for Java GitHub deposunda bir sorun bildirmenizi tavsiye ederiz.