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