基于SpringBoot+RabbitMQ完成应⽤通信

前言:

经过上面俩章学习,我们已经知道Rabbit的使用方式
RabbitMQ 七种工作模式介绍_rabbitmq 工作模式-CSDN博客

RabbitMQ的工作队列在Spring Boot中实现(详解常⽤的⼯作模式)-CSDN博客
作为⼀个消息队列,RabbitMQ也可以⽤作应⽤程序之间的通信.上述代码⽣产者和消费者代码放在不同的应⽤中即可完成不同应⽤程序的通信.

目录

前言:

一.创建项目

二.订单系统(⽣产者)

三.物流系统(消费者)

四.发送消息格式为对象



接下来我们来看,基于SpringBoot+RabbitMQ完成应⽤间的通信.
需求描述:
⽤⼾下单成功之后,通知物流系统,进⾏发货.(只讲应⽤通信,不做具体功能实现)

一.创建项目

为⽅便演示,把两个项⽬放在⼀个项⽬中

1)1. 创建⼀个空的项⽬rabbitmq-communication(其实就是⼀个空的⽂件夹)

2) 在这个项⽬⾥,创建Module

3)后续流程和创建SpringBoot项⽬⼀样

4)若发现识别不到java类文件

只需右击改项目文件,点进对应选项,修改成Maven即可


二.订单系统(⽣产者)

1)配置相应文件

2) 声明队列

java 复制代码
package com.bite.order.config;

import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.QueueBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitmqConfig {
    @Bean("orderQueue")
    public Queue orderQueue() {
        return QueueBuilder.durable("order.create").build();
    }
}

3) 编写下单接⼝,下单成功之后,发送订单消息

java 复制代码
package com.bite.order.controller;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.UUID;

@RequestMapping("/order")
@RestController
public class OrderController {
    @Autowired
    private RabbitTemplate rabbitTemplate;
    @RequestMapping("/create")
    public String create() {
        //省略相关操作 例如校验参数 相关数据库操作 
        //主要测试代码是否最后成功发送即可
        String orderId = UUID.randomUUID().toString();
        rabbitTemplate.convertAndSend("","order.create","下单成功, 订单 ID:"+orderId);
        return "下单成功!";
    }
}

4) 启动订单系统(生产者,观察结果)


三.物流系统(消费者)

1)配置相应文件

8080端⼝已经被订单系统占⽤了,修改物流系统的端⼝号为9090

2)监听队列

java 复制代码
package com.bite.logistics.listener;

import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
public class OrderListener {
    @RabbitListener(queues = "order.create")
    public void handleMessage(String message) {
        System.out.println("接收订单信息:"+message);
    }
}

结果:

java 复制代码
接收到消息:下单成功, 订单ID:a4c1dbdc-688d-430a-ac16-bca713f85940
接收到消息:下单成功, 订单ID:5d190f19-7a8c-4866-b6e7-2b2bbe79412d

四.发送消息格式为对象

定义一个对象

java 复制代码
import lombok.Data;
@Data
public class OrderInfo {
    private String orderId;
    private String name;
}

生产者:

java 复制代码
    @RequestMapping("/create2")
    public String create2() {
        //省略相关操作 例如校验参数 相关数据库操作
        //主要测试代码是否最后成功发送即可
        OrderInfo orderInfo = new OrderInfo();
        orderInfo.setOrderId(UUID.randomUUID().toString());
        orderInfo.setName("商品:"+new Random().nextInt(100));
        rabbitTemplate.convertAndSend("","order.create",orderInfo);
        return "下单成功!";
    }

此时为乱码,因此需要序列化

SpringAMQP提供了 Jackson2JsonMessageConverter 和
MappingJackson2MessageConverter 等转换器,我们需要把⼀个 MessageConverter 设置到 RabbitTemplate 中.

在config包里面添加

java 复制代码
    @Bean
    public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
        RabbitTemplate template = new RabbitTemplate(connectionFactory);
        template.setMessageConverter(jackson2JsonMessageConverter()); // 设置消息转换器
        return template;
    }

    private Jackson2JsonMessageConverter jackson2JsonMessageConverter() {
        return new Jackson2JsonMessageConverter();
    }

消费者:

java 复制代码
    @RabbitListener(queues = "order.create")
    public void handleMessage2(OrderInfo orderInfo) {
        System.out.println("接收订单信息OrderInfo :"+orderInfo);
    }

结语: 写博客不仅仅是为了分享学习经历,同时这也有利于我巩固知识点,总结该知识点,由于作者水平有限,对文章有任何问题的还请指出,接受大家的批评,让我改进。同时也希望读者们不吝啬你们的点赞+收藏+关注,你们的鼓励是我创作的最大动力!

相关推荐
用户908324602736 小时前
Spring AI 1.1.2 + Neo4j:用知识图谱增强 RAG 检索(上篇:图谱构建)
java·spring boot
用户8307196840821 天前
Spring Boot 集成 RabbitMQ :8 个最佳实践,杜绝消息丢失与队列阻塞
spring boot·后端·rabbitmq
Java水解1 天前
Spring Boot 视图层与模板引擎
spring boot·后端
Java水解1 天前
一文搞懂 Spring Boot 默认数据库连接池 HikariCP
spring boot·后端
洋洋技术笔记1 天前
Spring Boot Web MVC配置详解
spring boot·后端
初次攀爬者2 天前
Kafka 基础介绍
spring boot·kafka·消息队列
用户8307196840822 天前
spring ai alibaba + nacos +mcp 实现mcp服务负载均衡调用实战
spring boot·spring·mcp
Java水解2 天前
SpringBoot3全栈开发实战:从入门到精通的完整指南
spring boot·后端
用户8307196840823 天前
RabbitMQ vs RocketMQ 事务大对决:一个在“裸奔”,一个在“开挂”?
后端·rabbitmq·rocketmq
初次攀爬者3 天前
RocketMQ在Spring Boot上的基础使用
java·spring boot·rocketmq