Bagikan melalui


Memecahkan masalah Azure Event Hubs

Artikel ini membahas teknik investigasi kegagalan, kesalahan umum untuk jenis kredensial di pustaka Azure Event Hubs, dan langkah-langkah mitigasi untuk mengatasi kesalahan ini. Selain teknik dan panduan pemecahan masalah umum yang berlaku terlepas dari kasus penggunaan Azure Event Hubs, artikel berikut ini mencakup fitur tertentu dari pustaka Azure Event Hubs:

Sisa artikel ini mencakup teknik pemecahan masalah umum dan panduan yang berlaku untuk semua pengguna pustaka Azure Event Hubs.

Menangani pengecualian Azure Event Hubs

Semua pengecualian Event Hubs dibungkus dalam AmqpException. Pengecualian ini sering memiliki kode kesalahan AMQP yang mendasar yang menentukan apakah kesalahan harus dicoba kembali. Untuk kesalahan yang dapat diulang (yaitu, amqp:connection:forced atau amqp:link:detach-forced), perpustakaan klien mencoba memulihkan dari kesalahan ini berdasarkan opsi pengulangan yang ditentukan saat menginstansiasi klien. Untuk mengonfigurasi opsi coba lagi, ikuti contoh menerbitkan peristiwa ke partisi tertentu. Jika kesalahan tidak dapat dicoba ulang, ada beberapa masalah konfigurasi yang perlu diselesaikan.

Cara yang direkomendasikan untuk mengatasi pengecualian spesifik yang diwakili oleh pengecualian AMQP adalah dengan mengikuti panduan Azure Event Hubs Messaging Exceptions.

Menemukan informasi yang relevan dalam pesan pengecualian

AmqpException berisi tiga bidang berikut, yang menjelaskan kesalahan:

  • getErrorCondition: Kesalahan AMQP yang mendasar. Untuk deskripsi kesalahan, lihat dokumentasi AmqpErrorCondition Enum atau spesifikasi OASIS AMQP 1.0.
  • adalah nilai transient: Nilai yang menunjukkan apakah memungkinkan untuk mencoba melakukan operasi yang sama. Klien SDK menerapkan kebijakan coba lagi ketika kesalahan bersifat sementara.
  • getErrorContext: Berisi informasi berikut tentang asal kesalahan AMQP:

Pengecualian yang umum ditemui

amqp:connection:forced dan amqp:link:detach-forced

Ketika koneksi ke Azure Event Hubs diam, layanan memutuskan sambungan klien setelah beberapa waktu. Masalah ini tidak menjadi masalah karena klien membuat ulang koneksi saat operasi layanan diminta. Untuk informasi selengkapnya, lihat kesalahan AMQP di Azure Service Bus.

Masalah izin

AmqpException dengan AmqpErrorCondition dari amqp:unauthorized-access menandakan bahwa kredensial yang Anda berikan tidak mengizinkan untuk melakukan tindakan (menerima atau mengirim) dengan Azure Event Hubs. Untuk mengatasi masalah ini, coba tugas berikut:

Untuk solusi lain yang mungkin, lihat Memecahkan masalah autentikasi dan otorisasi dengan Azure Event Hubs.

Masalah konektivitas

Waktu habis saat mencoba koneksi ke layanan

Untuk mengatasi masalah batas waktu habis, coba langkah berikut:

Kegagalan jabat tangan TLS/SSL

Kesalahan ini dapat terjadi ketika proksi penyadapan digunakan. Untuk memverifikasi, sebaiknya uji di lingkungan hosting Anda dengan proksi dinonaktifkan.

Kesalahan kehabisan soket

Aplikasi harus lebih suka memperlakukan klien Azure Event Hubs sebagai singleton, membuat dan menggunakan satu instans selama masa pakai aplikasi mereka. Rekomendasi ini penting karena setiap jenis klien mengelola koneksinya. Saat Anda membuat klien Azure Event Hubs baru, itu menghasilkan koneksi AMQP baru, yang menggunakan soket. Selain itu, penting bahwa klien mewarisi dari java.io.Closeable, sehingga aplikasi Anda harus memanggil close() setelah selesai menggunakan klien tersebut.

Untuk menggunakan koneksi AMQP yang sama saat membuat beberapa klien, Anda dapat menggunakan bendera EventHubClientBuilder.shareConnection(), menyimpan referensi ke EventHubClientBuildertersebut, dan membuat klien baru dari instans penyusun yang sama.

Menghubungkan menggunakan sambungan IoT

Karena menerjemahkan string koneksi memerlukan kueri layanan IoT Hub, pustaka klien Azure Event Hubs tidak dapat menggunakannya secara langsung. Sampel IoTConnectionString.java menjelaskan cara mengkueri IoT Hub untuk menerjemahkan string koneksi IoT menjadi string yang dapat digunakan dengan Azure Event Hubs.

Untuk informasi selengkapnya, lihat artikel berikut ini:

Tidak dapat menambahkan komponen ke string koneksi

Klien Event Hubs warisan memungkinkan pelanggan untuk menambahkan komponen ke string koneksi yang diambil dari portal Azure. Klien warisan berada dalam paket com.microsoft.azure:azure-eventhubs dan com.microsoft.azure:azure-eventhubs-eph. Generasi saat ini hanya mendukung string koneksi dalam formulir yang diterbitkan oleh portal Microsoft Azure.

Tambahkan "TransportType=AmqpWebSockets"

Untuk menggunakan soket web, lihat sampel PublishEventsWithSocketsAndProxy.java.

Tambahkan "Authentication=Managed Identity"

Untuk mengautentikasi dengan Identitas Terkelola, lihat contoh PublishEventsWithAzureIdentity.java.

Untuk informasi selengkapnya tentang pustaka Azure.Identity, lihat postingan blog kami yang berjudul Autentikasi dan Azure SDK.

Mengaktifkan dan mengonfigurasi pengelogan

Azure SDK for Java menawarkan cerita pengelogan yang konsisten untuk membantu memecahkan masalah kesalahan aplikasi dan untuk membantu mempercepat resolusinya. Log yang dihasilkan menangkap alur aplikasi sebelum mencapai status terminal untuk membantu menemukan masalah akar. Untuk panduan tentang pengelogan, lihat Mengonfigurasi pengelogan di Azure SDK for Java dan gambaran umum pemecahan masalah .

Selain mengaktifkan pengelogan, atur tingkat log ke VERBOSE atau DEBUG memberikan wawasan tentang status pustaka. Bagian berikut menunjukkan contoh konfigurasi log4j2 dan logback untuk mengurangi pesan yang berlebihan saat pengelogan verbose diaktifkan.

Mengonfigurasi Log4J 2

Gunakan langkah-langkah berikut untuk mengonfigurasi Log4J 2:

  1. Tambahkan dependensi di pom.xml Anda dengan menggunakan yang dari sampel logging pom.xml, di bagian "Dependensi yang diperlukan untuk Log4j2".
  2. Tambahkan log4j2.xml ke folder src/main/resources Anda.

Mengonfigurasi logback

Gunakan langkah-langkah berikut untuk mengonfigurasi logback:

  1. Tambahkan dependensi di pom.xml Anda menggunakan dependensi dari sampel pengelogan pom.xml, di bagian "Dependensi yang diperlukan untuk logback".
  2. Tambahkan logback.xml ke folder src/main/resources Anda.

Mengaktifkan pengelogan transportasi AMQP

Jika mengaktifkan pengelogan klien tidak cukup untuk mendiagnosis masalah Anda, Anda dapat mengaktifkan pengelogan ke file di pustaka AMQP yang mendasar, Qpid Proton-J. Qpid Proton-J menggunakan java.util.logging. Anda dapat mengaktifkan pengelogan dengan membuat file konfigurasi dengan konten yang diperlihatkan di bagian berikutnya. Atau, atur proton.trace.level=ALL dan opsi konfigurasi apa pun yang Anda inginkan untuk implementasi java.util.logging.Handler. Untuk kelas implementasi dan opsinya, lihat Paket java.util.logging dalam dokumentasi Java 8 SDK.

Untuk melacak bingkai transportasi AMQP, atur variabel lingkungan PN_TRACE_FRM=1.

Contoh file "logging.properties"

File konfigurasi berikut mencatat output tingkat TRACE dari Proton-J ke file proton-trace.log:

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

Mengurangi pengelogan

Salah satu cara untuk mengurangi catatan log adalah dengan mengubah verbositas. Cara lain adalah menambahkan filter yang mengecualikan log dari paket nama pencatat seperti com.azure.messaging.eventhubs atau com.azure.core.amqp. Untuk beberapa contoh, lihat file XML di bagian Konfigurasi Log4J 2 dan Konfigurasi logback.

Saat Anda mengajukan bug, pesan log dari kelas-kelas dalam paket berikut sangat menarik perhatian:

  • com.azure.core.amqp.implementation
  • com.azure.core.amqp.implementation.handler
    • Pengecualiannya adalah Anda dapat mengabaikan pesan onDelivery di ReceiveLinkHandler.
  • com.azure.messaging.eventhubs.implementation

Langkah berikutnya

Jika panduan pemecahan masalah dalam artikel ini tidak membantu mengatasi masalah saat Anda menggunakan pustaka klien Azure SDK for Java, kami sarankan Anda mengajukan masalah di repositori Azure SDK for Java GitHub .