أبسط وضعية طابور في Java RabbitMQ تتكون من منتج ومستهلك.

RabbitMQ Simple Queue

حاليًا، تستخدم العمليات في Java مع RabbitMQ بشكل رئيسي حزمة spring-boot-starter-amqp لـ Spring Boot، والتي تستخدم بشكل أساسي Spring AMQP لتشغيل الطابور.

1. الدرس المسبق

يرجى قراءة الفصول التالية لفهم المعرفة ذات الصلة:

2. حزمة الاعتمادات

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

3. تكوين RabbitMQ

قم بتعديل تكوين application.yml:

spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest

4. تصريح الطابور

قم بتكوين الطابور من خلال فئة تكوين Spring Boot:

package com.tizi365.rabbitmq.config;

import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class QueueConfig {
    @Bean
    public Queue helloQueue() {
        // قم بتصريح الطابور، واسم الطابور يجب أن يكون فريدًا
        return new Queue("hello");
    }
}

نصيحة: يمكنك تعريف عدة طوابور وفقًا لاحتياجات العمل. اسم الطابور ومعرف الفاصلة لـ Queue يجب أن يكونا مختلفين. هنا، اسم الطريقة هو معرف الفاصلة.

5. إرسال الرسالة

يتطلب إرسال الرسائل فئة RabbitTemplate، التي قام Spring Boot بتهيئتها بالفعل لنا. ما عليك سوى حقن النسخة:

package com.tizi365.rabbitmq.service;

import org.springframework.amqp.core.Queue;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;

@Service
public class SendService {
    // حقن نموذج RabbitTemplate
    @Autowired
    private RabbitTemplate template;
    
    // حقن الطابور المعرف سابقًا
    @Autowired
    @Qualifier("helloQueue")
    private Queue helloQueue;
    
    // للعرض، نستخدم مهمة الجدول الزمني المدمجة لـ Spring لإرسال الرسائل بانتظام (رسالة واحدة كل ثانية)
    @Scheduled(fixedDelay = 1000, initialDelay = 1000)
    public void send() {
        // محتوى الرسالة
        String message = "مرحباً بالعالم!";
        // إرسال الرسالة
        // المعامل الأول هو مفتاح التوجيه، هنا نستخدم اسم الطابور كمفتاح توجيه
        // المعامل الثاني هو محتوى الرسالة، يدعم أي نوع طالما يدعم التسلسل
        template.convertAndSend(helloQueue.getName(), message);
        System.out.println("إرسال الرسالة '" + message + "'");
    }
}

نصيحة: هنا، لا نستخدم المبادل مباشرة. سيتم استخدام المبادل الافتراضي الأسفلي (المبادل المباشر) في الخلفية.

6. استقبال الرسالة

ليس من الصعب أيضًا بالنسبة للمستهلك استقبال الرسائل:

package com.tizi365.rabbitmq.listener;

import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
// تصريح مستمع الرسالة، حدد الطابور المراد الاستماع إليه من خلال المعلمة `queues`، التي يجب أن تكون متسقة مع اسم الطابور السابق
@RabbitListener(queues = "hello")
public class HelloListener {
	// استخدام RabbitHandler لتحديد معالج الرسالة، المستخدم لتنفيذ منطق معالجة الرسالة
    @RabbitHandler
    public void receive(String msg) {
        System.out.println("المستهلك - تم استقبال الرسالة '" + msg + "'");
    }
}

7. نوع الرسالة المخصص

سابقًا، قمنا بإرسال رسالة من نوع سلسلة. في سيناريوهات الأعمال الفعلية، نفضل إرسال مباشر لمختلف أنواع كائنات Java المخصصة.

تعريف كائن الكيان

package com.tizi365.rabbitmq.domain;

import java.io.Serializable;
import lombok.Data;

// محتوى المدونة
@Data
public class Blog implements Serializable {
    // الهوية
    private Integer id;
    // العنوان
    private String title;
}

إرسال رسائل من نوع مخصص

Blog blog = new Blog();
blog.setId(100);
blog.setTitle("دليل Tizi365 لـ RabbitMQ");

// إرسال الرسالة
template.convertAndSend(helloQueue.getName(), blog);

استقبال رسائل النوع المخصص

@RabbitHandler
// قم ببساطة بتغيير نوع الباراميتر في الدالة إلى نوع الرسالة المخصص
public void receive(Blog msg) {
    System.out.println("المستهلك - تم استقبال الرسالة '" + msg.getTitle() + "'");
}

استخدام تسلسل JSON لمحتوى الرسالة

عندما يُرسل RabbitMQ بيانات كائنات الكيان في جافا، فإنه يفترض استخدام أداة تسلسل الكائنات في دورة حياة جافا. يمكننا تغيير ذلك لاستخدام تنسيق JSON لتسلسل البيانات، مما يتيح للغات الأخرى استهلاك الرسائل المُرسلة من جافا ويجعل تنسيق الرسالة أكثر قراءةً.

قم بتعديل فئة التكوين السابقة وأضف التكوين التالي لاستخدام محول JSON لتسلسل وفك تسلسل بيانات الرسالة.

@Bean
public Jackson2JsonMessageConverter messageConverter() {
    // قم بتعيين محول الرسالة الافتراضي
    return new Jackson2JsonMessageConverter();
}