जावा RabbitMQ विषय पैटर्न, TopicExchange प्रकार का उपयोग करते हैं, इसका भेद रूटिंग पैटर्न (सीधा) से होता है कि रूटिंग पैरामीटर समर्थित धुंधली मिलान। क्योंकि रूटिंग मिलान और अधिक यथार्थ होते है, इसलिए यह अधिक प्रयोग किया जाने वाला पैटर्न है। यहां दी गई छवि में यह आर्किटेक्चर है:

RabbitMQ विषय पैटर्न

संकेत: यदि किसी भी 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.TopicExchange;
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 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.1 कताएँ परिभाषित करें और बाइंडिंग एक्सचेंज

संदेशों को कताओं से उपभोक्त करने के लिए, आपको पहले कता को परिभाषित करना होगा और फिर उस कता को लक्ष्य एक्सचेंज से बाइंड करना होगा। नीचे, दो कताएँ परिभाषित की गई हैं और उन्हें एक ही एक्सचेंज से बाइंड किया गया है।

package com.tizi365.rabbitmq.config;
import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
importorg.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 कौए सुननेवाले परिभाषित करें

विशिष्ट कताओं से संदेश सुनने के लिए RabbitListener एनोटेशन का उपयोग करके संदेश सुनने वाले को परिभाषित करें।

package com.tizi365.rabbitmq.listener;

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

// Spring को वर्तमान वर्ग का प्रबंधन करने दें
@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 रूटिंग कुंजी होती है जब एक्सचेंज से बाइंड किए जाते हैं, यह रूटिंग कुंजी (www.tizi365.com) के संदेशों को मैच करेगी। इसलिए, केवल कता 1 को संदेश प्राप्त करने की क्षमता होगी, जबकि कता 2 को किसी भी मिलान नहीं होगा क्योंकि अमिलित रूटिंग कुंजी के कारण।