Mendalami Exchange Headers
Kenali exchange Headers untuk merutekan pesan berdasarkan atribut header, bukan kunci routing. Terapkan aturan routing yang lebih kompleks dan dinamis.
Mendalami Exchange Headers adalah pelajaran RabbitMQ Messaging & Async Systems gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar RabbitMQ Messaging & Async Systems, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus RabbitMQ Messaging & Async Systems mencakup 4 pelajaran total.
Bagian dari pelajaran ini belum diterjemahkan dan ditampilkan dalam bahasa Inggris.
Headers Exchange: New Routing
Meet the Headers exchange! Unlike Direct or Topic exchanges that use a simple routing_key string, Headers exchanges route messages based on their header attributes.
Think of it as a more flexible way to filter messages, using key-value pairs attached to the message itself.
Routing by Message Headers
When a producer sends a message, it includes a map of key-value pairs (headers). A consumer binds its queue to a Headers exchange with its own set of header rules.
The exchange then compares the message headers to the binding rules to decide where to deliver the message.
Matching Logic: 'all' or 'any'
Headers exchanges use a special argument called x-match in the binding to define the matching logic:
"all": The message's headers must contain all the key-value pairs specified in the binding."any": The message's headers must contain at least one of the key-value pairs specified in the binding.
This gives you powerful control over message delivery!
Producing with Custom Headers
Let's see how a producer adds custom headers to a message. We'll send a simple text message with format: json and type: report headers.
Run this code to send a message:
import com.rabbitmq.client.*;
import java.util.HashMap;
import java.util.Map;
public class HeadersProducer {
private static final String EXCHANGE = "my_headers_exchange";
public static void main(String[] argv) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
try (Connection conn = factory.newConnection();
Channel channel = conn.createChannel()) {
channel.exchangeDeclare(EXCHANGE, "headers");
Map<String, Object> headers = new HashMap<>();
headers.put("format", "json");
headers.put("type", "report"); // Add headers
String msg = "Report Data (JSON)";
AMQP.BasicProperties props = new AMQP.BasicProperties.Builder()
.headers(headers)
.build();
channel.basicPublish(EXCHANGE, "", props, msg.getBytes("UTF-8"));
System.out.println(" [x] Sent: '" + msg + "' with headers: " + headers);
}
}
}Consumer 'All' Match Example
This consumer will only receive messages if all its specified headers (format: json AND type: report) are present in the incoming message.
Run this consumer first, then the producer from the previous scene.
import com.rabbitmq.client.*;
import java.util.HashMap;
import java.util.Map;
public class HeadersConsumerAll {
private static final String EXCHANGE = "my_headers_exchange";
public static void main(String[] argv) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection conn = factory.newConnection();
Channel channel = conn.createChannel();
channel.exchangeDeclare(EXCHANGE, "headers");
String queueName = channel.queueDeclare().getQueue();
Map<String, Object> bindHeaders = new HashMap<>();
bindHeaders.put("x-match", "all");
bindHeaders.put("format", "json");
bindHeaders.put("type", "report"); // Requires both
channel.queueBind(queueName, EXCHANGE, "", bindHeaders);
System.out.println(" [*] Waiting for msgs with ALL: " + bindHeaders);
DeliverCallback dc = (ct, delivery) -> {
String msg = new String(delivery.getBody(), "UTF-8");
System.out.println(" [x] Received '" + msg + "' Headers: " + delivery.getProperties().getHeaders());
};
channel.basicConsume(queueName, true, dc, ct -> {});
}
}Consumer 'Any' Match Example
Now, let's create a consumer that receives messages if any of its specified headers (format: xml OR priority: high) are present.
Run this consumer. Then, try sending messages with different header combinations.
import com.rabbitmq.client.*;
import java.util.HashMap;
import java.util.Map;
public class HeadersConsumerAny {
private static final String EXCHANGE = "my_headers_exchange";
public static void main(String[] argv) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection conn = factory.newConnection();
Channel channel = conn.createChannel();
channel.exchangeDeclare(EXCHANGE, "headers");
String queueName = channel.queueDeclare().getQueue();
Map<String, Object> bindHeaders = new HashMap<>();
bindHeaders.put("x-match", "any");
bindHeaders.put("format", "xml"); // Matches if format is xml
bindHeaders.put("priority", "high"); // OR if priority is high
channel.queueBind(queueName, EXCHANGE, "", bindHeaders);
System.out.println(" [*] Waiting for msgs with ANY: " + bindHeaders);
DeliverCallback dc = (ct, delivery) -> {
String msg = new String(delivery.getBody(), "UTF-8");
System.out.println(" [x] Received '" + msg + "' Headers: " + delivery.getProperties().getHeaders());
};
channel.basicConsume(queueName, true, dc, ct -> {});
}
}More on `x-match` Values
While "all" and "any" are the primary x-match values, you can also omit x-match. If x-match is not provided, it defaults to "all".
Remember that the header values must match exactly. For example, "type": "report" won't match "type": "Report".
When to Use Headers Exchange
Headers exchanges are great for:
- Dynamic Routing: When routing logic changes often without code deployments.
- Complex Filtering: Routing based on multiple, non-hierarchical attributes.
- Policy-Based Routing: For example, routing high-priority messages to a dedicated queue.
It adds flexibility where routing keys might be too rigid.
Headers vs. Other Exchanges
How does Headers compare?
- Direct: Routes by exact
routing_keymatch. - Topic: Routes by
routing_keypatterns (wildcards). - Headers: Routes by arbitrary message header key-value pairs, offering more attribute-based flexibility.
Choose the exchange type that best fits your message routing needs!
Headers Exchange Quiz
A producer sends a message with headers {"color": "red", "size": "large"}.
Which consumer binding configuration(s) will receive this message?
Lesson Summary
In this lesson, we explored the powerful Headers exchange. You learned:
- It routes messages based on header key-value pairs.
- The
x-matchargument ("all"or"any") controls the matching logic. - How to use it for flexible, attribute-based message routing.
This exchange offers a robust alternative to routing keys for complex filtering scenarios.
Belajar RabbitMQ Messaging & Async Systems dengan tutor AI — gratis
Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.
- Kursus
- 11
- Pelajaran
- 44
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Mendalami Exchange Headers” gratis?
Ya — teks lengkap “Mendalami Exchange Headers” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus RabbitMQ Messaging & Async Systems, upgrade ke CoddyKit PRO. Kursus RabbitMQ Messaging & Async Systems mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Mendalami Exchange Headers”?
Kenali exchange Headers untuk merutekan pesan berdasarkan atribut header, bukan kunci routing. Terapkan aturan routing yang lebih kompleks dan dinamis. Kamu berlatih RabbitMQ Messaging & Async Systems dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai RabbitMQ Messaging & Async Systems?
Tidak diperlukan pengalaman sebelumnya. RabbitMQ Messaging & Async Systems di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.
Berapa lama pelajaran “Mendalami Exchange Headers” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran RabbitMQ Messaging & Async Systems ini?
Ya. Setiap pelajaran RabbitMQ Messaging & Async Systems menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Mendalami Exchange Headers
- Binding Antar-Exchange
- Exchange Dead Letter (DLX)
- Exchange Alternatif untuk Pesan yang Tidak Dapat Dirutekan