IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 【应用】SpringBoot 整合 RabbitMQ -> 正文阅读

[Java知识库]【应用】SpringBoot 整合 RabbitMQ

引入依赖

创建 maven 项目 RabbirMQ,引入所使用的依赖

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>

        <!-- JSON -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>2.0.20</version>
        </dependency>

        <!-- Lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>

RabbitMQ 生产者

配置文件以及主启动类

首先在项目中创建子 maven 项目 RabbitProducer,配置 RabbitMQ 服务地址

server:
  port: 8081

spring:
  rabbitmq:
    host: <RabbitMq Server ip>
    port: 5672

创建主启动类

@SpringBootApplication
public class ProducerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ProducerApplication.class);
    }

}

配置 RabbitMQ 的 Exchange 以及 Queue

此处分别配置两种模式的交换机 Exchange,即 Direct 模式和 Topic 模式,有关交换机模式的内容请阅读RabbitMQ 基础

Direct Exchange

@Configuration
public class RabbitConfigFroDirect {
    /**
     * 创建 Direct 模式 Queue
     * Queue name:My_Direct_Queue01
     */
    @Bean
    public Queue directQueue01() {
        return new Queue("My_Direct_Queue01");
    }
    /**
     * 创建 Direct 模式 Queue
     * Queue name:My_Direct_Queue02
     */
    @Bean
    public Queue directQueue02() {
        return new Queue("My_Direct_Queue02");
    }
    /**
     * 创建 Direct 模式 Exchange
     * Exchange name:My_Direct_Exchange
     */
    @Bean
    public DirectExchange directExchange() {
        return new DirectExchange("My_Direct_Exchange");
    }
    /**
     * 绑定创建的 Exchange 以及 Queue01
     * Routing Key:Queue01
     */
    @Bean
    public Binding bindingDirect01() {
        return BindingBuilder.bind(directQueue01()).to(directExchange()).with("Queue01");
    }
    /**
     * 绑定创建的 Exchange 以及 Queue02
     * Routing Key:Queue02
     */
    @Bean
    public Binding bindingDirect02() {
        return BindingBuilder.bind(directQueue02()).to(directExchange()).with("Queue02");
    }

}

Topic Exchange

@Configuration
public class RabbitConfigForTopic {
    /**
     * 创建 Topic 模式 Queue
     * Queue name:My_Topic_Queue01
     */
    @Bean
    public Queue topicQueue01() {
        return new Queue("My_Topic_Queue01");
    }
    /**
     * 创建 Topic 模式 Queue
     * Queue name:My_Topic_Queue02
     */
    @Bean
    public Queue topicQueue02() {
        return new Queue("My_Topic_Queue02");
    }
    /**
     * 创建 Topic 模式 Exchange
     * Exchange name:My_Topic_Exchange
     */
    @Bean
    public TopicExchange topicExchange() {
        return new TopicExchange("My_Topic_Exchange");
    }
    /**
     * 绑定创建的 Exchange 以及 Queue01
     * Routing Key:*.topic
     */
    @Bean
    public Binding bindingTopic01() {
        return BindingBuilder.bind(topicQueue01()).to(topicExchange()).with("*.topic");
    }
    /**
     * 绑定创建的 Exchange 以及 Queue02
     * Routing Key:#.topic
     */
    @Bean
    public Binding bindingTopic02() {
        return BindingBuilder.bind(topicQueue02()).to(topicExchange()).with("#.topic");
    }

}

编写消息发送的服务类

编写消息发送服务类的接口,定义发送消息的方法,需要指定 Routing Key 以及消息内容

public interface ProducerService {

    /**
     * 发送消息至 RabbitMQ 队列
     * @param routingKey routingKey
     * @param detail 消息内容
     * @return 处理结果
     */
    String sendMessage(String routingKey, String detail);

}

对不同模式的 Exchange 分别实现上述接口,实现消息发送的方法。在调用消息发送的方法时,需要指定 Exchange、Routing Key 以及 消息内容

@Service
public class DirectProducerServiceImpl implements ProducerService {

    @Resource
    private AmqpTemplate amqpTemplate;

    /**
     * 发送消息
     * @param routingKey routingKey
     * @param detail 消息内容
     * @return 结果
     */
    @Override
    public String sendMessage(String routingKey, String detail) {
        amqpTemplate.convertAndSend("My_Direct_Exchange", routingKey, detail);
        return "消息发送成功:{Exchange:" + "My_Direct_Exchange|" + "Routing Key:" + routingKey + "|data:" + detail + "}";
    }
}
@Service
public class TopicProducerServiceImpl implements ProducerService {

    @Resource
    private AmqpTemplate amqpTemplate;

    /**
     * 发送消息
     * @param routingKey routingKey
     * @param detail 消息内容
     * @return 结果
     */
    @Override
    public String sendMessage(String routingKey, String detail) {
        amqpTemplate.convertAndSend("My_Topic_Exchange", routingKey, detail);
        return "消息发送成功:{Exchange:" + "My_Topic_Exchange|" + "Routing Key:" + routingKey + "|data:" + detail + "}";
    }

}

编写控制层接收请求并调用消息发送服务

@RestController
@RequestMapping("/producer")
public class ProducerController {

    @Resource(name = "directProducerServiceImpl")
    private ProducerService directProducerService;

    @Resource(name = "topicProducerServiceImpl")
    private ProducerService topicProducerService;

    /**
     * 发送消息
     * @param routingKey routingKey
     * @param detail 消息内容
     * @return 结果
     */
    @GetMapping ("/direct/{routingKey}/{detail}")
    public String sendForDirect(@PathVariable("routingKey") String routingKey,
                                @PathVariable("detail") String detail) {
        return directProducerService.sendMessage(routingKey, detail);
    }

    /**
     * 发送消息
     * @param routingKey routingKey
     * @param detail 消息内容
     * @return 结果
     */
    @GetMapping ("/topic/{routingKey}/{detail}")
    public String sendForTopic(@PathVariable("routingKey") String routingKey,
                                @PathVariable("detail") String detail) {
        return topicProducerService.sendMessage(routingKey, detail);
    }

}

RabbitMQ 消费者

配置文件以及主启动类

创建子 maven 项目 RabbitConsumer,编写配置文件

server:
 port: 8081

spring:
 rabbitmq:
 host: <RabbitMq Server ip>
 port: 5672

创建主启动类

@SpringBootApplication
public class ConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class);
    }

}

编写消息接收服务

使用@RabbitListener注解监听指定的队列,获取数据并进行处理即可

注:一般消息的传输使用 JSON 字符串的形式实现

@Component
public class RabbitReceiver {

    /**
     * 监听消息队列 My_Direct_Queue01
     */
    @RabbitListener(queues = "My_Direct_Queue01")
    public void directReceiver01(String detail) {
        System.out.println("消息接收成功:{" + "Queue:My_Direct_Queue01|data:" + detail + "}");
    }
    /**
     * 监听消息队列 My_Direct_Queue02
     */
    @RabbitListener(queues = "My_Direct_Queue02")
    public void directReceiver02(String detail) {
        System.out.println("消息接收成功:{" + "Queue:My_Direct_Queue02|data:" + detail + "}");
    }
    /**
     * 监听消息队列 My_Topic_Queue01
     */
    @RabbitListener(queues = "My_Topic_Queue01")
    public void topicReceiver01(String detail) {
        System.out.println("消息接收成功:{" + "Queue:My_Topic_Queue01|data:" + detail + "}");
    }
    /**
     * 监听消息队列 My_Topic_Queue02
     */
    @RabbitListener(queues = "My_Topic_Queue02")
    public void topicReceiver02(String detail) {
        System.out.println("消息接收成功:{" + "Queue:My_Topic_Queue02|data:" + detail + "}");
    }

}
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-12-25 10:52:39  更:2022-12-25 10:57:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年4日历 -2024/4/25 7:57:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码