角色
Producer / Publisher:
生产者, 一个发送消息的用户应用程序。
Consumer:
消费者,一个用来等待接收消息的用户应用程序。
Queue(msg):
消息队列,作用是接收消息、缓存消息,队列只受主机的内存和磁盘限制。生产者将消息发送到队列,队列是存储消息的缓冲区,消费者从队列中获取消息。
1、一个生产者对应一个消费者,通过队列进行消息传递。 2、使用默认的direct交换机。
Springboot集成
配置队列名
这里我们将队列名配置在application.yml文件中
## rabbitmq的队列及交换机名称
rabbitmq:
## 简单模式
simple:
## 队列名称
queue: simple
创建消费者
SimpleListener
package com.model.listener;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
/**
* @Author: Haiven
* @Time: 2024/4/19 10:29
* @Description: TODO
*/
@RabbitListener(queuesToDeclare = @Queue(value = "${rabbitmq.simple.queue}"))
public class SimpleListener {
@RabbitHandler
public void simpleHandler(String msg){
System.out.println("简单模式消费者接收消息:" + msg);
}
}
@RabbitListener:表示RabbitMQ消费者,声明一个队列
@RabbitHandler:标识接收消息后的回调方法
${rabbitmq.simple.queue}:上述配置的队列名,也可以写死
创建生产者并发送消息
package com.model.controller;
import com.code.domain.Response;
import com.model.service.RabbitService;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
* @Author: Haiven
* @Time: 2024/4/19 9:46
* @Description: TODO
*/
@RestController
@RequestMapping("/producer")
public class ProducerController {
@Resource
private RabbitService rabbitService;
@GetMapping("/simple")
public Response
boolean res = rabbitService.simple(msg);
return res ? Response.success() : Response.fail();
}
}
package com.model.service.impl;
import com.model.service.RabbitService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
/**
* @Author: Haiven
* @Time: 2024/4/19 10:51
* @Description: TODO
*/
@Service
@Slf4j
public class RabbitServiceImpl implements RabbitService {
@Resource
private RabbitTemplate rabbitTemplate;
@Value("${rabbitmq.simple.queue}")
private String simpleQueue;
@Override
public boolean simple(String msg) {
try {
rabbitTemplate.convertAndSend(simpleQueue, msg);
return true;
}catch (Exception e){
e.printStackTrace();
return false;
}
}
}
这里业务代码分层不做赘述,也可以都写到controller里面,或者直接使用springboot单元测试都可以;
编写完后调用接口
浏览器
后台
后台接收到消息并打印
注解参数详解
@RabbitListener
使用 @RabbitListener 注解可以将一个方法标记为 RabbitMQ 消息监听器。这个方法将会在收到指定队列的消息时被自动调用。@RabbitListener 注解提供了一些参数来配置监听器的行为和属性。
queues
指定监听的队列名,可以是一个字符串数组,用于指定监听多个队列。例如:@RabbitListener(queues = "myQueue") 或 @RabbitListener(queues = {"queue1", "queue2"})。
containerFactory
指定监听器容器工厂(listener container factory),用于创建消息监听器容器。如果不指定,默认使用 RabbitListenerContainerFactory bean。
id
为监听器指定一个唯一的标识符,用于在容器中标识该监听器。
admin:
指定 RabbitAdmin bean,用于声明队列、交换机等 RabbitMQ 组件。
autoStartup
指定监听器是否自动启动,默认为 true。如果设置为 false,则需要手动调用 start() 方法启动监听器。
ackMode
指定消息确认模式,有三种可选值:
AckMode.AUTO:自动确认模式,在消息成功处理后自动确认。AckMode.MANUAL:手动确认模式,在消息处理完毕后需要手动调用 channel.basicAck() 方法进行确认。AckMode.NONE:无确认模式,消息处理后不进行确认。
concurrency
指定并发消费者数量,用于设置监听器容器的并发消费者数目。
exclusive
指定是否为独占模式,默认为 false。如果设置为 true,则只有一个消费者可以监听该队列。
priority
指定监听器的优先级,用于设置监听器的调用顺序。
returnExceptions
指定是否返回异常,默认为 false。如果设置为 true,则在处理消息过程中抛出异常时将异常返回给消息代理。
@Queue
@Queue 注解用于声明队列,以便与 RabbitMQ 中的队列进行绑定。它可以在方法级别的 @RabbitListener 注解中使用,也可以在配置类中使用 @Bean 注解声明队列。@Queue 注解提供了一些参数来配置队列的属性。
value
队列的名称。如果未指定,则会自动生成一个唯一的队列名称。
name
同 value,用于指定队列的名称。
durable
指定队列是否持久化,默认为 true。如果设置为 true,则在 RabbitMQ 服务器重启后队列仍然存在。
autoDelete
指定队列是否自动删除,默认为 false。如果设置为 true,则当没有消费者连接到该队列时,队列将自动删除。
exclusive
指定队列是否为独占模式,默认为 false。如果设置为 true,则只有一个消费者可以监听该队列。
ignoreDeclarationExceptions
指定是否忽略声明队列时的异常,默认为 false。如果设置为 true,则在声明队列时发生异常时将忽略异常。
admin
指定 RabbitAdmin bean,用于声明队列。如果未指定,则会自动查找适合的 RabbitAdmin bean。
arguments
额外的队列参数,可以用于设置队列的其他属性。这是一个 Map 类型的参数,可以用于指定各种队列属性,如 x-message-ttl、x-max-length 等。
x-message-ttl:消息过期时间,指定消息在队列中的存活时间,单位为毫秒。x-expires:队列过期时间,指定队列的自动删除时间,单位为毫秒。x-max-length:队列最大长度,指定队列中允许存储的最大消息数量。x-max-length-bytes:队列最大字节数,指定队列中允许存储的消息的最大总字节数。x-dead-letter-exchange:死信交换机,指定队列中的死信消息将发送到的交换机。x-dead-letter-routing-key:死信路由键,指定死信消息发送到死信交换机时使用的路由键。
上述参数暂时了解,后续用到在做详解
相关链接
发表评论