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:
İ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:
- RabbitMQ Temel Kavramlar
- RabbitMQ Yönlendirme Modu Prensibi
- RabbitMQ ile Java İçin Hızlı Başlangıç (Okunması gereken bir bölüm, çünkü sonraki bölümler kodları tekrarlamayacak, sadece anahtar kodları gösterecek)
- RabbitMQ İçin Java İle Yayın-Abone Deseni (Okunması gereken bir bölüm, çünkü kod yapısı neredeyse aynı, sadece exchange türü ve yönlendirme parametreleri farklılık gösterir)
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.