جاوا RabbitMQ ٹاپک پیٹرن، TopicExchange قسم استعمال کرتے ہیں جو روٹنگ پیٹرن (مستقیم) سے مختلف ہے کہ روٹنگ پیرامیٹرز کو فضول میچنگ کا حمایت کرتے ہیں۔ روٹنگ میچنگ کی وجہ سے یہ پیٹرن زیادہ استعمال ہوتا ہے۔ تھیوقری اس کھیل کی زیر نگرانی میں ہے: RabbitMQ Topic Pattern

مشورہ: چاہے RabbitMQ کتنا بھی کام کرے پیٹرن استعمال کرتا ہے، اس میں فرق صرف ایکسچینج کی قسم اور روٹنگ پیرامیٹرز میں ہوتا ہے۔

1. پتہ ہے ٹیوٹوریل

براہ کرم مندرجہ ذیل سیکشنز پڑھیں تاکہ متعلقہ علم سمجھیں:

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.DirectExchange;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
importorg.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. پیغامات وصول کرنا

4.1 کیوزز تعریف کریں اور ایکسچینجز سے جوڑیں

میسیجز کو کیوزز سے استعمال کرنے کے لئے، آپ کو پہلے ایک کیو کا تعریف کرنی ہوگی اور پھر اس کیو کو ہدف ایکسچینج کے ساتھ جوڑنا ہوگا۔ نیچے، دو کیوزز کی تعریف کی گئی ہے اور انہیں ایک ہی ایکسچینج سے جوڑا گیا ہے۔

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");
    }

    @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 کیوز لسنرز کا تعریف کریں

رابط لسنر اشارے کا استعمال کرتے ہوئے پیغام لسنرز کو تعریف کریں تاکہ مخصوص قوانین سے میسیجز کو استعمال کیا جا سکے۔

package com.tizi365.rabbitmq.listener;

import org.springframework.amqp.rabbit.annotation.*;
import org.springframework.stereotype.Component;

// کمپوننٹ کو سپرنگ کے ذریعے منظم کریں
@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 کے راوٹنگ کی کے اسباق کے ساتھ ایکسچینج سے بائینڈ کریں جاتے ہیں، اس لئے صرف کیو 1 پیغام موصول کرے گا، جبکہ کیو 2 کو کسی موازنہ نہیں کرنے کی بنا پر کوئی پیغام موصول نہیں کرے گا۔