जावा RabbitMQ विषय पैटर्न, TopicExchange प्रकार का उपयोग करते हैं, इसका भेद रूटिंग पैटर्न (सीधा) से होता है कि रूटिंग पैरामीटर समर्थित धुंधली मिलान। क्योंकि रूटिंग मिलान और अधिक यथार्थ होते है, इसलिए यह अधिक प्रयोग किया जाने वाला पैटर्न है। यहां दी गई छवि में यह आर्किटेक्चर है:
संकेत: यदि किसी भी RabbitMQ काम करने के पैटर्न का उपयोग किया जाता है, तो इसका भेद विनिमय के प्रकार और रूटिंग पैरामीटरों में होता है।
1. पूर्वापेक्षित ट्यूटोरियल
कृपया संबंधित ज्ञान को समझने के लिए पहले निम्नलिखित खंड पढ़ें:
- RabbitMQ की मूल अवधारणाएँ
- RabbitMQ विषय पैटर्न नीतियाँ
- RabbitMQ के साथ जावा के लिए त्वरित प्रारंभ (एक अनिवार्य पठन है, क्योंकि आगामी खंड कोड को दोहराया नहीं करेंगे, केवल महत्वपूर्ण कोड दिखाएंगे)
- जावा RabbitMQ प्रकाशन-प्रिय पैटर्न खंड (एक अनिवार्य पठन है, क्योंकि कोड वाक्य-रंग सामान हैं, केवल विनिमय प्रकार और रूटिंग पैरामीटर भिन्न हैं)
2. विषय विनिमय की परिभाषा
Spring AMQP में, सीधे विनिमय के प्रतिष्ठित तथा संवादिकता विषय विनिमय है। हम एक Spring Boot विन्यास कक्षा के माध्यम से विनिमय की परिभाषा करते हैं।
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() {
// विन्यास करें
// मानदंड विन्यास का नाम है, जो यूनिक होना चाहिए
return new TopicExchange("tizi365.topic");
}
}
संकेत: संदेश उत्पादक और उपभोक्ता दोनों को विन्यास की आवश्यकता होती है।
3. संदेश भेजना
हम संदेश को विनिमय करते हैं, और विनिमय संज्ञानानुसार संदेशों को समर्थित कतारों को मानक नियमों पर भेजता है।
package com.tizi365.rabbitmq.service;
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;
// प्रदर्शन के उद्देश्य से, यहां एक समयसारित कार्य का उपयोग किया जाता है ताकि हर सेकंड में एक संदेश भेजा जा सके
@Scheduled(fixedDelay = 1000, initialDelay = 1000)
public void send() {
// संदेश सामग्री
String message = "नमस्ते दुनिया!";
// संदेश भेजें
// पहला पैरामीटर विनिमय का नाम है
// दूसरा पैरामीटर रूटिंग कुंजी है। विषय विनिमय कुंजी की मैच करती है सुने जाने वाले कतारों को संदेश पहुंचाती है
// तीसरा पैरामीटर संदेश सामग्री है, यहां संग्रहीत किसी भी प्रकार को समर्थित करता है जब तक इसे सीरीयलाइज किया जा सके
template.convertAndSend(topic.getName(), "www.tizi365.com", message);
System.out.println("संदेश भेजा गया: '" + message + "'");
}
}
संकेत: convertAndSend विधि में दूसरे पैरामीटर "www.tizi365.com" पर ध्यान दें, क्योंकि यह एक महत्वपूर्ण पैरामीटर है।
4.1 कताएँ परिभाषित करें और बाइंडिंग एक्सचेंज
संदेशों को कताओं से उपभोक्त करने के लिए, आपको पहले कता को परिभाषित करना होगा और फिर उस कता को लक्ष्य एक्सचेंज से बाइंड करना होगा। नीचे, दो कताएँ परिभाषित की गई हैं और उन्हें एक ही एक्सचेंज से बाइंड किया गया है।
package com.tizi365.rabbitmq.config;
import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
importorg.springframework.context.annotation.Configuration;
@Configuration
public class QueueConfig {
@Bean
public TopicExchange topic() {
// एक्सचेंज को परिभाषित करें
// पैरामीटर एक्सचेंज का नाम है, जो अद्वितीय होना चाहिए
return new TopicExchange("tizi365.topic");
}
@Bean
public Queue queue1() {
// कता 1 का परिभाषित करें
return new Queue("tizi365.topic.queue1");
}
@Bean
public Queue queue2() {
// कता 2 का परिभाषित करें
return new Queue("tizi365.topic.queue2");
}
@Bean
public Binding binding1(TopicExchange topic, Queue queue1) {
// बाइंडिंग संबंध का परिभाषित करें, जो कता 1 को टॉपिक एक्सचेंज से बाइंड करता है जिसका रूटिंग कुंजी है: *.tizi365.com
return BindingBuilder.bind(queue1).to(topic).with("*.tizi365.com");
}
@Bean
public Binding binding2(TopicExchange topic, Queue queue2) {
// बाइंडिंग संबंध का परिभाषित करें, जो कता 2 को डायरेक्ट एक्सचेंज से बाइंड करता है जिसका रूटिंग कुंजी है: *.baidu.com
return BindingBuilder.bind(queue2).to(topic).with("*.baidu.com");
}
}
टिप: कता 1 और कता 2 को एक्सचेंज से बाइंड करते समय, रूटिंग कुंजी को * (स्टार) वाइल्डकार्ड का उपयोग करके बनाया गया है, जो एक शब्द के मेल का मैच करता है। अगर इसे # (हैश) में बदला जाए, तो यह कई शब्दों का मैच करेगा।
4.2 कौए सुननेवाले परिभाषित करें
विशिष्ट कताओं से संदेश सुनने के लिए RabbitListener एनोटेशन का उपयोग करके संदेश सुनने वाले को परिभाषित करें।
package com.tizi365.rabbitmq.listener;
import org.springframework.amqp.rabbit.annotation.*;
import org.springframework.stereotype.Component;
// Spring को वर्तमान वर्ग का प्रबंधन करने दें
@Component
public class DemoListener {
// एक सुनने वाले को परिभाषित करें, queues पैरामीटर के माध्यम से यह निर्दिष्ट करें कि कुन कता को सुना जाएगा
@RabbitListener(queues = "tizi365.topic.queue1")
public void receive1(String msg) {
System.out.println("कता 1 से संदेश प्राप्त किया: " + msg);
}
// एक सुनने वाले को परिभाषित करें, queues पैरामीटर के माध्यम से यह निर्दिष्ट करें कि कुन कता को सुना जाएगा
@RabbitListener(queues = "tizi365.topic.queue2")
public void receive2(String msg) {
System.out.println("कता 2 से संदेश प्राप्त किया: " + msg);
}
}
क्योंकि केवल कता 1 के पास *.tizi365.com रूटिंग कुंजी होती है जब एक्सचेंज से बाइंड किए जाते हैं, यह रूटिंग कुंजी (www.tizi365.com) के संदेशों को मैच करेगी। इसलिए, केवल कता 1 को संदेश प्राप्त करने की क्षमता होगी, जबकि कता 2 को किसी भी मिलान नहीं होगा क्योंकि अमिलित रूटिंग कुंजी के कारण।