র্যাবিটএমকিউর রাউটিং প্যাটার্ন (ডিরেক্ট মোড) জাভাতে ডিরেক্ট এক্সচেঞ্জ টাইপের এক্সচেঞ্জ ব্যবহার করে। পাবলিশ-সাবস্ক্রাইব প্যাটার্ন থেকে পার্থক্য হল ডিরেক্ট এক্সচেঞ্জ ম্যাচ করা রাউটিং প্যারামিটার সহ মেসেজগুলি কিউতে পৌঁছায়। বিপরীত চিত্রটির শিল্প হল:

র্যাবিটএমকিউ ডিরেক্ট মোড

পরামর্শ: র্যাবিটএমকিউ কাজের মোড ব্যবহার করা যাবে কিছু না, পার্থক্য আসে এক্সচেঞ্জ টাইপ এবং রাউটিং প্যারামিটার নিয়ে।

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 = "হ্যালো ওয়ার্ল্ড!";
        // মেসেজ প্রেরণ করুন
        // প্রথম প্যারামিটারটি হল এক্সচেঞ্জ নাম
        // দ্বিতীয় প্যারামিটারটি হল রাউটিং কী। ডিরেক্ট এক্সচেঞ্জের সাথে, মেসেজটি "tizi365" ম্যাচ করা কিউতে পৌঁছায়
        // তৃতীয় প্যারামিটারটি হল মেসেজের বিষয়, যা কোনও প্রকার সমর্পিত হতে পারে যতক্ষণ পর্যন্ত সিরিয়ালাইজ করা যায়
        template.convertAndSend(direct.getName(), "tizi365", message);
        System.out.println("প্রেরিত মেসেজ '" + message + "'");
    }
}

পরামর্শ: convertAndSend পদক্ষেপের দ্বিতীয় প্যারামিটারের জন্য লক্ষ্য দিন, যেটি গুরুত্বপূর্ণ প্যারামিটার।

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 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 কিউ লিস্টেনার ডিফাইন করা

র‍্যাবিট লিস্টেনার এনাটটেশন ব্যবহার করে নির্দিষ্ট কিউ থেকে মেসেজ কনসিউম করার জন‍্য মেসেজ লিস্টেনার ডিফাইন করুন:

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, কারণ রাউটিং কী মেলেনা, তারা কোনও মেসেজ পাবে না।