从零开始,5分钟轻松实现Spring Boot与RabbitMQ的无缝集成

🌏 环境

  • docker v4.16.2
  • springboot 2.7.0
  • RabbitMQ 3.9.1
    • rabbitmq_delayed_message_exchange 3.9.0

ps:代码地址 gitee

🪜 服务架构

使用maven多模块,将生产者、消费者分别以springboot项目启动,两者通过RabbitMQ进行消息通信。

在这里插入图片描述

消息发送方

spring-boot-mq-rabbit-mq-producer
在这创建路由、队列、交换机,并进行消息的发送,分为普通消息和延迟消息。开启消息的ack,可以对失败的消息进行重复发送。

消息接收方

spring-boot-mq-rabbit-mq-consumer
消息接收方需要对监听的队列进行创建,需要注意的是消息可能重复发送,需要对接口进行幂等性处理。

🍚 食用方法

  1. 运行docker-compose.yml启动环境
  2. 启动生产者SpringBootRabbitMqProducerApplication.java
  3. 启动消费者SpringBootRabbitMqConsumerApplication.java
  4. 等待日志打印

🪛 自定义配置项

路由、交换机、队列

RabbitAdminConfig.java
  • 配置RabbitAdmin方法,能够动态加载 路由、队列、交换机
DirectExchangeConf.java

交换机、路由键、队列配置

  • 本示例是根据完整路由键进行消息推送示例
  • 示例中每个不同的路由、队列、交换机可以根据需要添加相应的方法进行组合
RabbitTemplateWrapper.java
  • 增强RabbitTemplate,使之能够开启确认机制
  • 示例中每个不同的路由、队列、交换机可以根据需要添加相应的方法进行组合

延迟消息

创建交换机时,配置交换机参数,使之延迟发送

// 交换机  
Map<String, Object> args = new HashMap<>(1);  
args.put("x-delayed-type", "direct");  
Exchange exchange =  
        new CustomExchange(RabbitMqConstant.EXCHANGE_DELAYED, "x-delayed-message", true, false, args);

封装消息发送,添加消息实体类,增强消息内容,添加id和时间信息,同时设置过期时间

/***  
 * 发送延时消息  
 * @param data 消息  
 * @param routingKey 路由键  
 * @param delay  时间  
 */  
public void syncSendDelayed(String data, String routingKey, int delay) {  
    // 创建消息  
    RabbitMqMessage message = new RabbitMqMessage();  
    message.setData(data);  
    String uuid = UUID.randomUUID().toString();  
    message.setId(uuid);  
    message.setSendTime(LocalDateTime.now());  
    String messageStr = JSONUtil.toJsonStr(message);  
    MessagePostProcessor postProcessor = postProcessMessage -> {  
        // 设置过期时间  
        postProcessMessage.getMessageProperties().setHeader("x-delay", delay);  
        return postProcessMessage;  
    };  
    // 发送延时消息  
    rabbitTemplate.convertAndSend(RabbitMqConstant.EXCHANGE_DELAYED, routingKey, messageStr, postProcessor);  
}

📚 测试效果

消息发送
在这里插入图片描述

数据接收
在这里插入图片描述

常见问题

vhost not fond 问题

Caused by: com.rabbitmq.client.ShutdownSignalException: connection error; protocol method: #method<connection.close>(reply-code=530, reply-text=NOT_ALLOWED - vhost /test not found, class-id=10, method-id=40)
at com.rabbitmq.utility.ValueOrException.getValue(ValueOrException.java:66)
at com.rabbitmq.utility.BlockingValueOrException.uninterruptibleGetValue(BlockingValueOrException.java:36)
at com.rabbitmq.client.impl.AMQChannel$BlockingRpcContinuation.getReply(AMQChannel.java:502)
at com.rabbitmq.client.impl.AMQChannel.privateRpc(AMQChannel.java:293)
at com.rabbitmq.client.impl.AMQChannel.exnWrappingRpc(AMQChannel.java:141)
… 108 more

需要在RabbitMq管理页面,Admin->Virtual Hosts 创建

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值