জাভা RabbitMQ পাবলিশ/সাবস্ক্রাইব প্যাটার্ন (ব্রডকাস্ট মোড, ফ্যানআউট মোড)

ফ্যানআউট এক্সচেঞ্জ টাইপটি RabbitMQ-তে পাবলিশ/সাবস্ক্রাইব প্যাটার্নের জন্য ব্যবহার হয়, যেখানে একটি প্রোডিউসার দ্বারা প্রেরিত একটি বার্তা একাধিক কনসুমার কিউ-তে প্রসেস করা হবে। বিশেষ এক্সচেঞ্জের বিপন্ন আকারণ নিম্নলিখিত ডায়াগ্রামে প্রদর্শিত:

RabbitMQ Work Mode

ফ্যানআউট এক্সচেঞ্জ এসব বাউন্ড কিউ-তে বার্তা পৌঁছে দিতে পারে।

টিপ: RabbitMQ কাজের মোড ব্যবহার করা হোক, পার্থক্যটি এক্সচেঞ্জ টাইপ এবং রাউটিং প্যারামিটার ব্যবহার করা।

1. প্রাথমিক টিউটোরিয়ালগুলি

সংশ্লিষ্ট জ্ঞান বুঝতে প্রথমে নিম্নলিখিত অনুচ্ছেদগুলি পড়ুন:

2. ফ্যানআউট এক্সচেঞ্জ সংজ্ঞায়িত করা

Spring AMQP-তে, FanoutExchange ক্লাস একাধিক এক্সচেঞ্জ এর সাথে সাম্বদ্ধ। আমরা একটি Spring Boot কনফিগারেশন ক্লাসের মাধ্যমে ইন্টারফেসটি সংজ্ঞায়িত করি।

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;

// বর্তমান ক্লাসটিকে স্প্রিং দ্বারা পরিচালিত করুন
@Component
public class DemoListener {
    // লিসেনার সংজ্ঞায়িত করুন, এবং কিউটি শুনতে কোনটি স্পেসিফাই করুন
    @RabbitListener(queues = "tizi365.fanout.queue1")
    public void receive1(String msg) {
        System.out.println("কিউ 1 থেকে মেসেজ পেয়েছি = " + msg);
    }

    // লিসেনার সংজ্ঞায়িত করুন, এবং কিউটি শুনতে কোনটি স্পেসিফাই করুন
    @RabbitListener(queues = "tizi365.fanout.queue2")
    public void receive2(String msg) {
        System.out.println("কিউ 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("কিউ 3 থেকে মেসেজ পেয়েছি = " + msg);
}

ব্যাখ্যা:

  • কিউবাইন্ডিং এনোটেশন: কিউ এবং এক্সচেঞ্জ এর মধ্যে বাইন্ডিং সম্পর্ক সংজ্ঞা করে। মান প্যারামিটার ব্যবহার করা হয় কিউ সংজ্ঞা করা এবং এক্সচেঞ্জ ক্রমানুসারী সংজ্ঞা করা।
  • কিউ এনোটেশন: একটি কিউ সংজ্ঞা করে। নাম প্যারামিটার কিউ নাম সংজ্ঞা করে (যা অবশ্যই অনন্যীক হতে হবে), এবং ডিউরেবল প্যারামিটার সূচিত করে তা দ্রুত জরিত করা আবশ্যক কিনা।
  • এক্সচেঞ্জ এনোটেশন: একটি এক্সচেঞ্জ সংজ্ঞা করে। নাম প্যারামিটার এক্সচেঞ্জ নাম সংজ্ঞা করে, এবং ধরন প্যারামিটার এক্সচেঞ্জ ধরন সূচিত করে।