Java में RabbitMQ रूटिंग पैटर्न (Direct mode) DirectExchange प्रकार के एक्सचेंज का उपयोग करता है। पब्लिश-सब्सक्राइब पैटर्न से विभिन्नता यह है कि Direct एक्सचेंज मैसेज को उन कतारों में पहुंचाता है जिनके रूटिंग पैरामीटर पूरी तरह से मिलते हैं। तास्वीर में वादकीकृत संरचना निम्नलिखित है:

RabbitMQ Direct Mode

सूचना: रैबिटएमक्यू के काम के मोड का अनुप्रयोग करें या नहीं, उसकी विभिन्नता एक्सचेंज प्रकार और रूटिंग पैरामीटर में होती है।

1. पूर्वापेक्षित ट्यूटोरियल

कृपया संबंधित ज्ञान को समझने के लिए निम्नलिखित खंड पढ़ें:

2. Direct Exchange का परिभाषा

स्प्रिंग AMQP में, Direct exchange के संबंधित कक्षा DirectExchange है। हम इस एक्सचेंज की परिभाषा एक स्प्रिंग बूट कॉन्फ़िगरेशन कक्षा के माध्यम से करते हैं।

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" से मेल खाने वाली कतार में पहुंचाया जाता है
        // तीसरा पैरामीटर संदेश सामग्री है, जो किसी भी प्रकार का समर्थन करता है जब तक यह serialize कर सके
        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;

// Spring को वर्तमान वर्ग का प्रबंधन करने दें
@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, क्योंकि रूटिंग कुंजी मेल नहीं खाती, कोई संदेश नहीं प्राप्त करेगा।