All Products
Search
Document Center

ApsaraMQ for RabbitMQ:Bagaimana cara memecahkan masalah error ExchangeHasDiffFields yang dilaporkan pada klien ApsaraMQ for RabbitMQ?

Last Updated:Jul 06, 2025

Topik ini menjelaskan penyebab dan solusi untuk error ExchangeHasDiffFields yang dilaporkan pada klien ApsaraMQ for RabbitMQ.

Deskripsi Masalah

Saat mengakses broker ApsaraMQ for RabbitMQ dari klien ApsaraMQ for RabbitMQ, error ExchangeHasDiffFields seperti ExchangeHasDiffFields[ODurable=true&NDurable=false;] dilaporkan.

Catatan

Dalam informasi error, parameter yang dimulai dengan O menunjukkan nilai atribut dari exchange yang digunakan, sedangkan parameter yang dimulai dengan N menunjukkan nilai atribut dari exchange yang dideklarasikan.

Penyebab

Nilai atribut dari exchange yang digunakan tidak konsisten dengan nilai atribut dari exchange yang dideklarasikan. Tabel berikut menjelaskan parameter atribut yang mungkin tidak konsisten.

Parameter

Tipe

Deskripsi

exchange

String

Nama exchange.

type

String

Tipe exchange. Nilai yang valid:

  • fanout: Exchange tipe ini mengirim semua pesan yang diterima ke semua antrian yang terikat pada exchange ini. Anda dapat menggunakan exchange fanout untuk menyiarkan pesan.

  • direct: Exchange tipe ini mengirim pesan ke antrian yang memiliki kunci routing persis sama dengan kunci routing pesan tersebut.

  • topic: Tipe ini mirip dengan tipe exchange direct. Exchange tipe ini mengirim pesan ke satu atau lebih antrian berdasarkan hasil pencocokan fuzzy atau multi-kondisi antara kunci routing pesan dan kunci routing exchange saat ini.

durable

boolean

Menentukan apakah exchange bersifat durable. Nilai yang valid:

  • true: Exchange secara otomatis dipulihkan ketika klien tersambung kembali ke broker ApsaraMQ for RabbitMQ. Opsi ini cocok untuk skenario bisnis jangka panjang dengan persyaratan keandalan tinggi, seperti notifikasi transaksi keuangan dan pemrosesan pesanan.

  • false: Exchange tidak secara otomatis dipulihkan ketika klien tersambung kembali ke broker ApsaraMQ for RabbitMQ. Opsi ini cocok untuk skenario bisnis sementara dengan persyaratan keandalan rendah, seperti pengujian dan tugas jangka pendek.

Catatan

Secara default, exchange bersifat durable, baik dibuat dengan memanggil operasi API CreateExchange maupun di halaman Exchanges di Konsol ApsaraMQ for RabbitMQ.

autoDelete

boolean

Menentukan apakah exchange dapat dihapus secara otomatis. Nilai yang valid:

  • true: Exchange secara otomatis dihapus setelah antrian terakhir yang terikat dilepaskan dari exchange.

  • false: Exchange tidak secara otomatis dihapus setelah antrian terakhir yang terikat dilepaskan dari exchange.

Catatan

Secara default, exchange tidak dihapus secara otomatis, baik dibuat dengan memanggil operasi API CreateExchange maupun di halaman Exchanges di Konsol ApsaraMQ for RabbitMQ.

internal

boolean

Menentukan apakah exchange adalah exchange internal. Nilai default: false. Nilai yang valid:

  • true: Exchange terikat ke exchange lain.

  • false: Exchange terikat ke antrian.

arguments

Map

Parameter lain dari exchange, seperti exchange alternatif.

Sebagai contoh, jika nilai parameter durable dari exchange yang digunakan tidak konsisten dengan nilai parameter durable dari exchange yang dideklarasikan, maka error ExchangeHasDiffFields[ODurable=true&NDurable=false;] akan dilaporkan.

  • Nilai parameter durable dari exchange yang digunakan adalah false.

    Catatan

    Anda dapat memanggil operasi API ListExchanges atau melakukan operasi di halaman Exchanges di Konsol ApsaraMQ for RabbitMQ untuk mendapatkan nilai parameter atribut dari exchange yang digunakan.

  • Nilai parameter durable dari exchange yang dideklarasikan adalah true.

    Contoh kode:

    channel.exchangeDeclare("test", "direct", false, false, false, null);

Solusi

Ubah nilai yang tidak konsisten dalam kode deklarasi untuk memastikan nilainya sesuai dengan nilai dari exchange yang digunakan. Dalam contoh berikut, nilai parameter durable diubah menjadi false.

Contoh kode:

channel.exchangeDeclare("test", "direct", true, false, false, null);