حالت سادهترین صف در Java RabbitMQ شامل یک تولیدکننده و یک مصرفکننده است.
در حال حاضر، عملیات 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");
}
}
نکته: میتوانید بر اساس نیازهای کسبوکار چندین صف را تعریف کنید. نام صف و شناسه bean دارای تفاوت باید باشند. در اینجا نام متد شناسه bean است.
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 = "Hello World!";
// پیام را ارسال کنید
// پارامتر اول کلید مسیری است، اینجا ما از نام صف به عنوان کلید مسیری استفاده میکنیم
// پارامتر دوم محتوای پیام است که هر نوعی را پشتیبانی میکند تا سرریزی
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. نوع پیام سفارشی
قبلا، ما یک پیام از نوع رشته ارسال کردیم. در سناریوهای واقعی کسبوکار، ترجیح داریم نوعهای مختلف اشیاء سفارشی جاوا را مستقیما ارسال کنیم.
تعریف شیء نهادی
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("Consumer - پیام '" + msg.getTitle() + "' دریافت شد");
}
استفاده از سریالسازی JSON برای محتوای پیام
وقتی RabbitMQ داده شیء موجودیت Java را ارسال میکند، به صورت پیشفرض از ابزار سریالسازی شیء JDK استفاده میکند. ما میتوانیم آن را به فرمت JSON برای سریالسازی دادهها تغییر دهیم، که این امکان را برای زبانهای دیگر برای مصرف پیامهای ارسالی از جاوا فراهم کرده و فرمت پیام را خواناتر میکند.
کلاس پیکربندی اولیه را بهینه کنید و پیکربندی زیر را برای استفاده از تجزیه و ترکیب دادههای جیسون جکسون به پیکربندی اضافه کنید.
@Bean
public Jackson2JsonMessageConverter messageConverter() {
// تنظیم مبدل پیام پیشفرض
return new Jackson2JsonMessageConverter();
}