جاوا RabbitMQ پبلش/سبسکرائب پیٹرن (براڈکاسٹ موڈ، فین آوٹ موڈ)
فین آوٹ ایکسچینج ایکسچینج قسم استعمال ہوتا ہے براڈکاسٹ موڈ کے لئے رابٹ ایم کیو، جہاں ایک پروڈیوسر سے بھیجی گئی پیغام کو متعدد کنسیومر قیودوں کے ذریعے پروسیس کیا جائے گا۔ ایم کیو کی تعمیر مندرجہ ذیل ڈائیاگرام میں دکھائی گئی ہے:
فین آوٹ ایکسچینج تمام باؤنڈ کیوز کو پیغام فارورڈ کرسکتا ہے۔
مشورہ: رابٹ ایم کیو کا کام موڈ جو بھی استعمال ہو، اس میں فرق صرف ایکسچینج قسم اور راوٹنگ پیرامیٹرز استعمال کرنے میں ہوتا ہے۔
1. پہلے سیکشن کا مطالعہ کریں
براہ کرم درج ذیل سیکشنز کو پہلے پڑھیں تاکہ متعلقہ علم سمجھ سکیں:
- RabbitMQ بنیادی تصورات
- RabbitMQ پبلش/سبسکرائب پیٹرن
- RabbitMQ جاوا تیز شروعات گائیڈ (ضروری ہے، کیونکہ متعاقبین سیکشنز میں کوڈ کی نقل نہیں کی جائے گی، صرف کچھ کوڈ اسنیپٹس دکھایا جائے گا)
2. فین آوٹ ایکسچینج کی تعریف
سپرنگ AMQP میں، فین آوٹ ایکسچینج کلاس فین آوٹ ایکسچینج کے مطابق ہوتی ہے۔ ہم ایک سپرنگ بوٹ کنفگریشن کلاس کے ذریعے ایکسچینج کی تعریف کرتے ہیں۔
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 = "ہیلو ورلڈ!";
// پیغام بھیجنا
// پہلا پیرامیٹر ایکسچینج کا نام ہے
// دوسرا پیرامیٹر راوٹنگ کی چابی ہے؛ فین آوٹ ایکسچینج راوٹنگ کی چابی کو نظرانداز کرے گا، لہذا یہ سیٹ کرنے کی ضرورت نہیں ہے
// تیسرا پیرامیٹر پیغام کا مواد ہے، جو کسی بھی قسم کو سپورٹ کرتا ہے جسے سیریلائز کیا جا سکے
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;
// Make the current class managed by Spring
@Component
public class DemoListener {
// Define a listener, and specify which queue to listen to using the queues parameter
@RabbitListener(queues = "tizi365.fanout.queue1")
public void receive1(String msg) {
System.out.println("Received message from queue 1 = " + msg);
}
// Define a listener, and specify which queue to listen to using the queues parameter
@RabbitListener(queues = "tizi365.fanout.queue2")
public void receive2(String msg) {
System.out.println("Received message from queue 2 = " + msg);
}
}
اس سبق میں پہلے ہی ایکسچینج کو فین آؤٹ قسم کے طور پر تعریف کیا گیا ہے، ہر پیغام کو فیشن ایکسچینج سے بند کردیا جائے گا اور مندرجہ بالا دو میتھڈز سے الگ الگ طریقے سے سبق کیا جائے گا۔
نوٹ: ریبٹ لسنر اینوٹیشن کو ایک کلاس یا میتھڈ پر لاگو کیا جا سکتا ہے۔ اگر ریبٹ لسنر اینوٹیشن ایک کلاس پر تعریف کیا گیا ہے، تو یہ ریبٹ ہینڈلر اینوٹیشن کے ساتھ مربوط کرنا ہوگا تاکہ بتایا جا سکے کہ کون سی کلاس کا میتھڈ پیغام کو ہینڈل کرے گا۔
4.3 مکمل اینوٹیشن کے ساتھ قائمہ لسنرز کا تعریف کریں
ایسپرنگ بوٹ کنفیگریشن کلاس کی ضرورت نہیں ہے تاکہ ایکسچینج، قیوز، اور بائنڈنگ رشتے تعریف کی جا سکیں۔ آپ ریبٹ لسنر اینوٹیشن کے بائنڈنگس پیرامیٹر کے ذریعے بائنڈنگ رشتوں، قیوز، اور ایکسچینج کو براہِ راست تعریف کرسکتے ہیں۔
@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("Received message from queue 3 = " + msg);
}
تشریح:
- QueueBinding اینوٹیشن: قیوز اور ایکسچینج کے درمیان بائنڈنگ رشتے کی تعریف کرتا ہے۔ قیمت پیرامیٹر استعمال ہوتا ہے تاکہ قیوز کی تعریف کی جا سکے، اور ایکسچینج استعمال ہوتا ہے تاکہ ایکسچینج کی تعریف کی جا سکے۔
- Queue اینوٹیشن: قیوز کی تعریف کرتا ہے۔ نام پیرامیٹر قیوز کا نام تعین کرتا ہے (جو یکتا ہونا چاہئے)، اور دورست پیرامیٹر بتاتا ہے کہ کیا یہ دائمی ہونا چاہئے یا نہیں۔
- Exchange اینوٹیشن: ایکسچینج کی تعریف کرتا ہے۔ نام پیرامیٹر ایکسچینج کا نام مقرر کرتا ہے، اور ٹائپ پیرامیٹر ایکسچینج کی قسم کو ظاہر کرتا ہے۔