角色

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 simple(String msg){

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:死信路由键,指定死信消息发送到死信交换机时使用的路由键。

 上述参数暂时了解,后续用到在做详解

相关链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: