RabbitMQ项目实战(一)

news/2024/10/18 23:28:13/

文章目录

  • RabbitMQ项目实战
    • 选择客户端
    • 基础实战

前情提要:我们了解了消息队列,RabbitMQ的入门,交换机,以及核心特性等知识,现在终于来到了激动人心的项目实战环节!本小节主要介绍通过Spring Boot RabbitMQ Starter 在SpringBoot项目中跑通测试RabbitMQ,话不多说,我们马上开始!

RabbitMQ项目实战

选择客户端

怎么在项目中使用RabbitMQ?

  1. 使用官方的客户端(类比jdbc)

优点:兼容性好,换语言成本低,比较灵活
缺点:太灵活,要自己去处理一些事情,比如要自己维护管理链接,很麻烦

  1. 使用封装好的客户端,比如Spring Boot RabbitMQ Starter(类比mybatis)

优点:简单易用,直接配置直接用,更方便地去管理链接
缺点:不够灵活,被框架限制

基础实战

我们使用Spring Boot RabbitMQ Starter
https://spring.io/guides/gs/messaging-rabbitmq/

  1. 引入依赖
    注意:使用的版本一定要和你的springboot版本一致,去maven中心仓库中找版本一致的
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-amqp -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId><version>2.7.2</version>
</dependency>

2) 在yml中引入配置

spring:rabbitmq:host: localhostport: 5672password: guestusername: guest

3)创建交换机和队列,一般在项目启动之前执行创建一次即可

package com.yupi.springbootinit.bimq;import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;/*** 用于创建测试程序用到的交换机和队列(只用在程序启动前执行一次)*/
public class MqInitMain {public static void main(String[] args) {try{ConnectionFactory factory  = new ConnectionFactory();factory.setHost("localhost");Connection connection = factory.newConnection();Channel channel = connection.createChannel();String EXCHANGE_NAME = "code_exchange";channel.exchangeDeclare(EXCHANGE_NAME,"direct");String queueName = "code_queue";channel.queueDeclare(queueName,true,false,false,null);channel.queueBind(queueName,EXCHANGE_NAME,"my_routingKey");}catch (Exception e){}}
}

4)生产者代码

package com.yupi.springbootinit.bimq;import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Component;import javax.annotation.Resource;@Component
public class MyMessageProducer {@Resourceprivate RabbitTemplate rabbitTemplate;public void sendMessage(String exchange,String routingKey,String message){rabbitTemplate.convertAndSend(exchange,routingKey,message);}
}

5)消费者代码

package com.yupi.springbootinit.bimq;import com.rabbitmq.client.Channel;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.support.AmqpHeaders;
import org.springframework.messaging.handler.annotation.Header;
import org.springframework.stereotype.Component;@Component
@Slf4j
public class MyMessageConsumer {//使用@SneakyThrows注解简化异常处理//使得你可以在不声明抛出异常的方法中抛出受检异常,而无需捕获它们。这在一些特定情况下可能会很有用,但通常不建议频繁使用,因为它可能会破坏代码的可读性和健壮性。@SneakyThrows//使用@RabbitListener注解指定要监听的队列名称为"code_queue",并设置消息的确认机制为手动确认@RabbitListener(queues = {"code_queue"},ackMode = "MUNAL")// // 在RabbitMQ中,每条消息都会被分配一个唯一的投递标签,用于标识该消息在通道中的投递状态和顺序。通过使用@Header(AmqpHeaders.DELIVERY_TAG)注解,可以从消息头中提取出该投递标签,并将其赋值给long deliveryTag参数。public void reciveMessage(String message, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long deliverttag){log.info("receiveMessage message = {}", message);//手动确认消息的接收channel.basicAck(deliverttag,false);}
}

测试类测试

package com.yupi.springbootinit.bimq;import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;import javax.annotation.Resource;import static org.junit.jupiter.api.Assertions.*;
@SpringBootTest
class MyMessageProducerTest {@Resourceprivate MyMessageProducer myMessageProducer;@Testvoid sendMessage() {myMessageProducer.sendMessage("code_exchange", "my_routingKey", "你好呀");}
}

image.png
打印出了日志,说明消费者收到了消息,测试通过!
既然测试已经通过,接下来那就把它运用到项目中去吧!欲知后事如何,且听下回分解~


http://www.ppmy.cn/news/1428934.html

相关文章

k8s安装,linux-ubuntu上面kubernetes详细安装过程

官方文档&#xff1a;https://kubernetes.io/zh-cn/docs/setup/production-environment/container-runtimes/ 环境配置 该部分每个主机都要执行 如果你确定不需要某个特定设置&#xff0c;则可以跳过它。 设置root登录 sudo passwd root sudo vim /etc/ssh/sshd_config Perm…

JavaWeb 监听器

Javaweb监听器是一种特殊的类&#xff0c;用于监听Web应用程序中的事件和对象。它可以监听Web应用程序的启动和关闭事件&#xff0c;会话的创建和销毁事件&#xff0c;以及请求和响应的事件等。监听器可以在特定事件发生时执行一些特定的操作&#xff0c;比如记录日志、初始化资…

python连接数据库失败怎么解决

Python 连接数据库失败怎么解决&#xff1f; 什么是 PyMySQL&#xff1f; PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库&#xff0c;Python2中则使用mysqldb。 PyMySQL 遵循 Python 数据库 API v2.0 规范&#xff0c;并包含了 pure-Python MySQL 客户端库。…

数字谐振器设计

数字谐振器设计 电路里的谐振:当电路中激励的频率等于电路的固有频率时&#xff0c;电路电磁振荡的振幅也将达到峰值。 形式一 形式二 例子

MCU的最佳存储方案CS创世 SD NAND

MCU的最佳存储方案CS创世 SD NAND 写在最前面MCU是什么CS创世 SD NAND 6大优势 写在最前面 转载自 雷龙官网 MCU是什么 大家都知道MCU是一种"麻雀"虽小&#xff0c;却"五脏俱全"的主控。它的应用领域非常广泛&#xff0c;小到手机手表&#xff0c;大到航空…

excel文件预览: luckyexcel+luckysheet

luckyexcel 使用 npm i luckyexcel --saveluckysheet 使用 luckysheet文档 克隆Luckysheet源码到本地 git clone https://github.com/dream-num/Luckysheet.git安装依赖 npm install npm install gulp -g 开发 npm run dev打包 npm run build本地引入 npm run build 后 …

SVN服务端提交日志不能为空,限制文件大小和文件类型(windows)

1. windows环境下&#xff0c;修改svn的pre-commit hook以实现提交日志不能为空&#xff0c;限制文件大小和文件类型。 2. 将下列代码复制粘贴进去即可。 echo off setlocal enabledelayedexpansion set REPOS%1 set TXN%2 rem 限制的文件大小byte set MAX_SIZE51200for /f &q…

创建一个javascript公共方法的npm包,js-tool-big-box,发布到npm上,一劳永逸

前端javascript的公共方法太多了&#xff0c;时间日期的&#xff0c;数值的&#xff0c;字符串的&#xff0c;搞复制的&#xff0c;搞网络请求的&#xff0c;搞数据转换的&#xff0c;几乎就是每个新项目&#xff0c;有的拷一拷&#xff0c;没有的继续写&#xff0c;放个utils目…