Java'da RabbitMQ yönlendirme deseni (Doğrudan mod), Exchange türü olarak DirectExchange kullanır. Yayın-abone deseninden farkı, Direct Exchange'in tam eşleşen yönlendirme parametrelerine sahip kuyruklara mesajları iletmesidir. Mimarideki yapı aşağıdaki resimde gösterilmiştir:

RabbitMQ Direct Mode

İpucu: Kullanılan RabbitMQ çalışma modundan bağımsız olarak, farklılık kullanılan exchange türünde ve yönlendirme parametrelerindedir.

1. Önkoşul Öğreticiler

İlgili bilgileri anlamak için lütfen aşağıdaki bölümleri okuyun:

2. Doğrudan Exchange'i Tanımlamak

Spring AMQP'de, Direct Exchange'e karşılık gelen sınıf DirectExchange'dir. Exchange'i Spring Boot yapılandırma sınıfı aracılığıyla tanımlarız.

package com.tizi365.rabbitmq.config;

import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class QueueConfig {
	@Bean
    public DirectExchange direct() {
        // Exchange'i tanımla
        // Parametre exchange adıdır ve benzersiz olmalıdır
        return new DirectExchange("tizi365.direct");
    }
}

İpucu: Mesaj üreticisi ve tüketici de bir exchange'e gereksinim duyar.

3. Mesaj Gönderimi

Mesajları exchange'e göndeririz ve exchange daha sonra yönlendirme kurallarına dayanarak mesajları ilgili kuyruklara iletir.

package com.tizi365.rabbitmq.service;

import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;

@Service
public class SendService {
    @Autowired
    private RabbitTemplate template;
    @Autowired
    private DirectExchange direct;

    // Gösterim için her saniye bir mesaj göndermek için zamanlanmış bir görev kullanıyoruz
    @Scheduled(fixedDelay = 1000, initialDelay = 1000)
    public void send() {
        // Mesaj içeriği
        String message = "Merhaba Dünya!";
        // Mesajı gönder
        // İlk parametre exchange adıdır
        // İkinci parametre yönlendirme anahtarıdır. Doğrudan exchange ile, mesaj "tizi365" ile eşleşen yönlendirme anahtarına sahip kuyruğa iletilir
        // Üçüncü parametre mesaj içeriğidir, serileştirilebilen herhangi bir türü destekler
        template.convertAndSend(direct.getName(), "tizi365", message);
        System.out.println("Gönderilen mesaj '" + message + "'");
    }
}

İpucu: convertAndSend metodundaki ikinci parametreye dikkat edin, çünkü bu önemli bir parametredir.

4. Mesajları Almak

4.1 Kuyrukları Tanımlayın ve Takas Eşleşmesine Bağlayın

Mesajları bir kuyruktan tüketmek için öncelikle bir kuyruğu tanımlamanız ve daha sonra kuyruğu hedef değişimle bağlamanız gerekir. Aşağıdaki kod iki kuyruğu tanımlar ve bunları aynı takas eşleşmesine bağlar:

package com.tizi365.rabbitmq.config;
import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class QueueConfig {
    @Bean
    public DirectExchange direct() {
        // Takası tanımla
        // Parametre takas adıdır ve benzersiz olmalıdır
        return new DirectExchange("tizi365.direct");
    }

    @Bean
    public Queue queue1() {
        // Kuyruğu tanımla 1
        return new Queue("tizi365.direct.queue1");
    }

    @Bean
    public Queue queue2() {
        // Kuyruğu tanımla 2
        return new Queue("tizi365.direct.queue2");
    }

    @Bean
    public Binding binding1(DirectExchange direct, Queue queue1) {
        // Kuyruğu 1'i "tizi365" yönlendirme anahtarıyla doğrudan takasa bağlamak için bir bağlama tanımla
		// Yönlendirme anahtarı "tizi365" ile eşleştiğinde takas mesajları kuyruk 1'e iletecektir
        return BindingBuilder.bind(queue1).to(direct).with("tizi365");
    }

    @Bean
    public Binding binding2(DirectExchange direct, Queue queue2) {
        // Kuyruğu 2'yi "baidu" yönlendirme anahtarıyla doğrudan takasa bağlamak için bir bağlama tanımla
		// Yönlendirme anahtarı "baidu" ile eşleştiğinde takas mesajları kuyruk 2'ye iletecektir
        return BindingBuilder.bind(queue2).to(direct).with("baidu");
    }
}

4.2 Kuyruk Dinleyicilerini Tanımlayın

Belirli kuyruklardan mesajları tüketmek için RabbitListener açıklamasını kullanarak mesaj dinleyicilerini tanımlayın:

package com.tizi365.rabbitmq.listener;

import org.springframework.amqp.rabbit.annotation.*;
import org.springframework.stereotype.Component;

// Spring'in mevcut sınıfı yönetmesine izin ver
@Component
public class DemoListener {
    // Kuyruk 1'den mesajları tüketmek için bir dinleyiciyi tanımla
    @RabbitListener(queues = "tizi365.direct.queue1")
    public void receive1(String msg) {
        System.out.println("Kuyruk 1'den alınan mesaj: " + msg);
    }

    // Kuyruk 2'den mesajları tüketmek için bir dinleyiciyi tanımla
    @RabbitListener(queues = "tizi365.direct.queue2")
    public void receive2(String msg) {
        System.out.println("Kuyruk 2'den alınan mesaj: " + msg);
    }
}

Sadece kuyruk 1 takasa bağlanırken "tizi365" yönlendirme anahtarına sahip olduğundan, sadece kuyruk 1 mesaj alabilir. Kuyruk 2 ise yönlendirme anahtarı eşleşmediği için hiçbir mesaj alamaz.