RabbitMQ کے راستہ بنانے والے نمونے (سیدھا موڈ) میں جاوا DirectExchange قسم کا تبادلہ استعمال ہوتا ہے۔ PUBLISH-SUBSCRIBE نمونے سے فرق یہ ہے کہ یہ Direct ایکسچینج پیغامات کو ایسے قیفوں میں پہنچاتا ہے جن کے راستہ بنانے کے پیرامیٹر مکمل میچ ہوتے ہیں۔ بنیادی تشریح نیچے دی گئی تصویر میں دکھائی گئی ہے۔

RabbitMQ Direct Mode

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

1. پہلے تعلیمی ورک شاپ

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

2. سیدھے ایکسچینج کی تعریف

Spring AMQP میں سیدھے ایکسچینج کے مطابقتی کلاس DirectExchange ہے۔ ہم ایکسچینج کو ایک 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 DirectExchange direct() {
        // ایکسچینج کی تعریف
        // پیرامیٹر ایکسچینج کا نام ہے ، جو یکتا ہونا ضروری ہے
        return new DirectExchange("tizi365.direct");
    }
}

مشورہ: پیغام پیدا کنندہ اور مصرف دونوں ایکسچینج کا مطالب ہوتے ہیں۔

3. پیغامات بھیجیں

ہم پیغامات کو ایکسچینج کو بھیجتے ہیں ، جو پھر راستہ بنانے کے قواعد پر پیغامات کو متعلقہ قیفوں میں پہنچاتا ہے۔

package com.tizi365.rabbitmq.service;

import org.springframework.amqp.core.DirectExchange;
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 DirectExchange direct;

    // نمایش کے لئے ہم ہر سیکنڈ ایک پیغام بھیجنے کے لئے ایک منظم ٹاسک استعمال کرتے ہیں
    @Scheduled(fixedDelay = 1000, initialDelay = 1000)
    public void send() {
        // پیغام کا مواد
        String message = "Hello World!";
        // پیغام بھیجیں
        // پہلا پیرامیٹر ایکسچینج کا نام ہے
        // دوسرا پیرامیٹر راستے کی چابی ہے۔ سیدھے ایکسچینج کے ساتھ ، پیغام وہ قیف میں پہنچاتے ہیں جو "tizi365" سے میچ کرتا ہے
        // تیسرا پیرامیٹر پیغام کا مواد ہے، جو کسی بھی قسم کا ہو سکتا ہے جب تک یہ سیریلائز کیا جا سکے
        template.convertAndSend(direct.getName(), "tizi365", message);
        System.out.println("Sent message '" + message + "'");
    }
}

مشورہ: convertAndSend میں دوسرے پیرامیٹر پر توجہ دیں ، چونکہ یہ ایک اہم پیرامیٹر ہے۔

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 DirectExchange direct() {
        // ایکسچینج کی تعریف
        // پیرامیٹر ایکسچینج کا نام ہے، جو یکتا ہونا ضروری ہے
        return new DirectExchange("tizi365.direct");
    }

    @Bean
    public Queue queue1() {
        // قوس 1 کی تعریف
        return new Queue("tizi365.direct.queue1");
    }

    @Bean
    public Queue queue2() {
        // قوس 2 کی تعریف
        return new Queue("tizi365.direct.queue2");
    }

    @Bean
    public Binding binding1(DirectExchange direct, Queue queue1) {
        // قوس 1 کو "tizi365" راوٹنگ کی کی کرنے کیلئے بانڈ کرنے کی تعریف
		// جب راوٹنگ میچ "tizi365" ہوتا ہے، تب ایکسچینج پیغامات کو قوس 1 تک پہنچائے گا
        return BindingBuilder.bind(queue1).to(direct).with("tizi365");
    }

    @Bean
    public Binding binding2(DirectExchange direct, Queue queue2) {
        // قوس 2 کو "baidu" راوٹنگ کی کی کرنے کیلئے بانڈ کرنے کی تعریف
		// جب راوٹنگ میچ "baidu" ہوتا ہے، تب ایکسچینج پیغامات کو قوس 2 تک پہنچائے گا
        return BindingBuilder.bind(queue2).to(direct).with("baidu");
    }
}

4.2 قوس لسنرز کی تعریف کریں

مخصوص قوسات سے پیغامات کو استعمال کرنے کے لئے RabbitListener اینوٹیشن کا استعمال کرکے پیغام لسنرز کی تعریف کریں:

package com.tizi365.rabbitmq.listener;

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

// فہمانے کے لئے موزوں کلاس کو سپرنگ کی دیکھ بھال کرنے دیں
@Component
public class DemoListener {
    // قوس1 سے پیغامات کو استعمال کرنے کے لئے لسنر کی تعریف
    @RabbitListener(queues = "tizi365.direct.queue1")
    public void receive1(String msg) {
        System.out.println("قوس1 سے پیغام موصول ہوا: " + msg);
    }

    // قوس2 سے پیغامات کو استعمال کرنے کے لئے لسنر کی تعریف
    @RabbitListener(queues = "tizi365.direct.queue2")
    public void receive2(String msg) {
        System.out.println("قوس2 سے پیغام موصول ہوا: " + msg);
    }
}

کیونکہ صرف قوس 1 کے بائنڈ کرتے وقت "tizi365" راوٹنگ کی گئی ہے، اس لئے صرف قوس 1 پیغامات موصول کر سکتا ہے۔ قوس 2، کیونکہ راوٹنگ کی میچ نہیں ہوتی، وہ کوئی پیغامات نہیں موصول کرے گا۔