RabbitMQ & .NET 6 Series [Part 3 – Topic Exchange]

Artikel ini adalah kelanjutan dari artikel sebelumnya yang membahas tentang penggunaan Direct Exchange dengan RabbitMQ. Pada artikel ini akan dibahas cara penggunaan Topic Exchange, berbeda dengan jenis exchange sebelumnya Direct Exchange yang menggunakan “fix” routing key, pada Topic Exchange, consumer dapat menentukan routing key secara lebih fleksibel, sebagai contoh consumer dapat menggunakan routing pattern seperti (“*”), sebagai contoh katalog.*, maka consumer akan mengambil semua pesan yang mempunyai awalan routing key katalog tanpa memperhatikan karakter setelah awalan tersebut.

Menambahkan Publisher

Pada project RabbitMQProducer yang sudah dibuat pada artikel sebelumnya, tambahkan class dengan nama TopicExchangePublisher.cs, kemudian tambahkan kode berikut ini:

namespace RabbitMQProducer
{
    public class TopicExchangePublisher
    {
        public static void Publish(IModel channel)
        {
            channel.ExchangeDeclare("contoh-topic-exchange",
            ExchangeType.Topic);

            var count = 0;
            while (true)
            {
                var message = new { Name = "Producer", Message = $"Urutan pesan ke: {count}" };
                var body = Encoding.UTF8.GetBytes(JsonSerializer.Serialize(message));
                channel.BasicPublish("contoh-topic-exchange", "katalog.details", null, body);
                count++;
                Thread.Sleep(1000);
            }

        }
    }
}

Pada kode diatas yang berbeda dengan kode pada artikel sebelumnya adalah tipe exchange yang digunakan yaitu Topic. Untuk menjalankan class tersebut tambahkan kode pada Program.cs.

using RabbitMQ.Client;
using RabbitMQProducer;

var factory = new ConnectionFactory
{
    Uri = new Uri("amqp://guest:guest@localhost:5672")
};
using var connection = factory.CreateConnection();
using var channel = connection.CreateModel();
TopicExchangePublisher.Publish(channel);

Menambahkan Consumer

Pada project RabbitMQConsumer, tambahkan class TopicExchangeConsumer.cs.

namespace RabbitMQConsumer
{
    public static class TopicExchangeConsumer
    {
        public static void Consume(IModel channel)
        {
            channel.ExchangeDeclare("contoh-topic-exchange", ExchangeType.Topic);
            channel.QueueDeclare("contoh-topic-queue",
                durable: true,
                exclusive: false,
                autoDelete: false,
                arguments: null);
            channel.QueueBind("contoh-topic-queue", "contoh-topic-exchange", "katalog.*");

            var consumer = new EventingBasicConsumer(channel);
            consumer.Received += (sender, e) =>
            {
                var body = e.Body.ToArray();
                var message = Encoding.UTF8.GetString(body);
                Console.WriteLine(message);
            };

            channel.BasicConsume("contoh-topic-queue", true, consumer);
            Console.WriteLine("Aplikasi consumer dijalankan...");
            Console.ReadLine();
        }
    }
}

Dari kode deiatas dapat dilihat bahwa routing key yang digunakan mengandung pattern (“*”), sehingga consumer akan menerima pesan dari Publisher yang mengirimkan pesan dengan alamat routing key berawalan “katalog”. Panggil class tersebut pada Program.cs.

using RabbitMQ.Client;
using RabbitMQConsumer;


var factory = new ConnectionFactory
{
    Uri = new Uri("amqp://guest:guest@localhost:5672")
};
using var connection = factory.CreateConnection();
using var channel = connection.CreateModel();

TopicExchangeConsumer.Consume(channel);

Kemudian jalankan Consumer app dan Publisher app untuk melihat hasilnya.

Dapat dilihat bahwa contoh-topic-queue sudah terbinding pada contoh-topic-exchange dengan routing key “katalog.*”

Jika kedua aplikasi Publisher dan Consumer dijalankan dapat dilihat pesan yang dikirimkan oleh Publisher dapat diproses oleh Consumer.

Advertisement

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s