Java RabbitMQ topic deseni, TopicExchange türünü kullanarak yönlendirme deseninden (Doğrudan) farklıdır çünkü yönlendirme parametreleri bulanık eşlemeyi destekler. Yönlendirme eşleme daha esnek olduğu için, daha yaygın kullanılan bir desendir. Mimarisi aşağıdaki şemada gösterildi:
İpucu: Hangi RabbitMQ çalışma deseni kullanırsanız kullanın, fark değişim türünde ve yönlendirme parametrelerindedir.
1. Önkoşul Öğretici
Lütfen ilgili bilgileri anlamak için öncelikle aşağıdaki bölümleri okuyun:
- RabbitMQ Temel Kavramlar
- RabbitMQ Topic Deseni İlkeleri
- Java için RabbitMQ Hızlı Başlangıç (Okunması gerekir, çünkü sonraki bölümler kodu tekrar etmeyecektir, yalnızca anahtar kodu gösterecektir)
- Java RabbitMQ Yayın-Abone Deseni Bölümü (Okunması gerekir, çünkü kod sözdizimi neredeyse aynıdır, yalnızca değişme türü ve yönlendirme parametreleri farklıdır)
2. Topic Exchange Tanımlama
Spring AMQP'de, Doğrudan değişime karşılık gelen sınıf TopicExchange'dir. Değişimi 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 TopicExchange topic() {
// Değişimi tanımla
// Parametre değişim adıdır, benzersiz olmalıdır
return new TopicExchange("tizi365.topic");
}
}
İpucu: Hem mesaj üreticileri hem de tüketicileri değişime ihtiyaç duyar.
3. Mesaj Gönderme
Mesajları değişime göndeririz ve değişim mesajları yönlendirme kurallarına dayalı olarak ilgili kuyruklara iletilir.
package com.tizi365.rabbitmq.service;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.TopicExchange;
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 TopicExchange topic;
// Gösterim amaçlı, her saniye bir mesaj göndermek için zamanlanmış bir görev kullanılır
@Scheduled(fixedDelay = 1000, initialDelay = 1000)
public void send() {
// Mesaj içeriği
String message = "Merhaba Dünya!";
// Mesajı gönder
// İlk parametre değişim adıdır
// İkinci parametre yönlendirme anahtarıdır. Topic değişim, yönlendirme anahtarına uyan kuyruklara mesaj iletilir
// Üçüncü parametre mesaj içeriğidir, seri hale getirilebilen herhangi bir türü destekler
template.convertAndSend(topic.getName(), "www.tizi365.com", message);
System.out.println("Gönderilen mesaj: '" + message + "'");
}
}
İpucu: convertAndSend yöntemindeki ikinci parametre "www.tizi365.com" dikkate alınmalıdır, çünkü bu önemli bir parametredir.
4. Mesajları Almak
4.1 Kuyrukları Tanımlayın & Exchange'lere Bağlayın
Mesajları kuyruklardan tüketmek için öncelikle bir kuyruk tanımlamanız ve daha sonra kuyruğu hedef exchange ile bağlamanız gerekir. Aşağıda, iki kuyruk tanımlanmış ve aynı exchange'e bağlanmıştır.
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 TopicExchange topic() {
// Exchange'i tanımlayın
// Parametre exchange adıdır ve benzersiz olmalıdır
return new TopicExchange("tizi365.topic");
}
@Bean
public Queue queue1() {
// Kuyruk 1'i tanımlayın
return new Queue("tizi365.topic.queue1");
}
@Bean
public Queue queue2() {
// Kuyruk 2'yi tanımlayın
return new Queue("tizi365.topic.queue2");
}
@Bean
public Binding binding1(TopicExchange topic, Queue queue1) {
// Kuyruk 1'i *.tizi365.com yönlendirme anahtarı ile exchange'e bağlayan bir bağlantı ilişkisi tanımlayın
return BindingBuilder.bind(queue1).to(topic).with("*.tizi365.com");
}
@Bean
public Binding binding2(TopicExchange topic, Queue queue2) {
// Kuyruk 2'yi *.baidu.com yönlendirme anahtarı ile direkt exchange'e bağlayan bir bağlantı ilişkisi tanımlayın
return BindingBuilder.bind(queue2).to(topic).with("*.baidu.com");
}
}
İpucu: Kuyruk 1 ve kuyruk 2'yi exchange'e bağlarken, yönlendirme anahtarları her ikisi de * (yıldız) joker karakterini kullanarak tek kelime eşleştirmektedir. Eğer # (diğer kuyruk) simgesine değiştirilirse, birden çok kelimeyi eşleştirirdi.
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 şu anki sınıfı yönetmesine izin verin
@Component
public class DemoListener {
// Bir dinleyici tanımlayın, queues parametresi aracılığıyla hangi kuyruğu dinleyeceğinizi belirleyin
@RabbitListener(queues = "tizi365.topic.queue1")
public void receive1(String msg) {
System.out.println("Kuyruk 1'den alınan mesaj: " + msg);
}
// Bir dinleyici tanımlayın, queues parametresi aracılığıyla hangi kuyruğu dinleyeceğinizi belirleyin
@RabbitListener(queues = "tizi365.topic.queue2")
public void receive2(String msg) {
System.out.println("Kuyruk 2'den alınan mesaj: " + msg);
}
}
Sadece kuyruk 1'in exchange'e bağlanırken *.tizi365.com yönlendirme anahtarına sahip olduğu için, (www.tizi365.com) yönlendirme anahtarına sahip mesajları eşleşecektir. Bu nedenle, yalnızca kuyruk 1 mesajları alabilecekken kuyruk 2 eşleşmeyen yönlendirme anahtarı nedeniyle hiçbir mesaj almayacaktır.