【springboot整合】RabbitMQ

news2024/9/29 13:24:03

Spring与消息

概述

  1. 消息中间件的主要作用:提高系统异步通信、扩展解耦能力
  2. 消息服务的两个重要概念:消息代理(message broker)和目的地(destination)
  3. 消息队列的两种形式的目的地:队列(点对点消息通信)和主题(发布/订阅消息通信)
  4. 点对点式:消息发送者发送消息,消息代理将其放入一个队列中,消息接收者从队列中获取消息内容,消息读取后被移除队列;消息只有唯一的发送着和接收者,但并非说只能有一个接受这
  5. 发布订阅式:发送者(发布者)发送消息主题,多个接收者(订阅者)监听(订阅)这个主题,消息会被接收者接收
  6. JMS(Java Message Service)Java消息服务:基于jvm消息代理的规范。activeMQ、hornetMQ是JMS实现
  7. AMQP(Advanced Message Queuing Protocol):高级消息队列,也是一个消息代理的规范,兼容JMS。RabbitMQ是AMQP实现。
  8. Spring支持:spring-jms提供了对JMS的支持;spring-rabbit提供了对AMQP的支持;需要ConnectionFactory的实现来链接消息代理;提供JmsTemplate、RabbitTemplate来发送消息;@JmsListener(JMS)、@RabbitListener(AMQP)注解在方法上监听消息代理发布的消息;@EnableJms、@EnableRabbit开启支持
  9. SpringBoot自动配置:JmsAutoConfiguration、RabbitAutoConfiguration

RabbitMQ

核心概念

  1. Message:由消息头和消息体组成。消息体是不透明的,而消息头则是由一系列的可选属性组成,包括routing-key、priority、delivery-mode等
  2. Publisher:消息的生产者
  3. Exchange:交换其,接收生产者的消息,然后通过绑定的routing-key发送到队列。包含direct、fanout、topic和headers四种类型
  4. Queue:消息队列,保存消息,等待消费者消费。
  5. Binding:绑定,消息队列和交换器之间的关联。一个绑定就是基于routing-key将交换器和消息队列连接起来的规则。
  6. Connection:网络连接
  7. Channel:信道,多路服用连接中的一条独立的双向数据流通道。建立到网络连接上的虚拟连接
  8. Consumer:消费者,消费消息
  9. Virtual Host:虚拟主机,表示一批交换器、消息队列和相关对象。mini版的RabbitMQ服务器,拥有自己的队列、交换器、绑定和权限机制。vhost是AMQP概念的基础,必须在连接时指定,RabbitMQ默认的vhost是/。
  10. Broker:消息队列服务器实体
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xykbnnDT-1688290522499)(src/main/resources/image/RabbitMQ概览.png)]

使用教程

  1. 依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
  1. 配置
spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
  1. 使用RabbitListener进行消息监听

@Service
public class OrderService {


    @RabbitListener(queues = "exchange")
    public void receive(Order order) {
        System.out.println("order = " + order);
    }
}
public class Order {
    private String orderNo;

    private String productName;

    private Double price;

    private Long number;


    public String getOrderNo() {
        return orderNo;
    }

    public void setOrderNo(String orderNo) {
        this.orderNo = orderNo;
    }

    public String getProductName() {
        return productName;
    }

    public void setProductName(String productName) {
        this.productName = productName;
    }

    public Double getPrice() {
        return price;
    }

    public void setPrice(Double price) {
        this.price = price;
    }

    public Long getNumber() {
        return number;
    }

    public void setNumber(Long number) {
        this.number = number;
    }

    @Override
    public String toString() {
        return "Order{" +
                "orderNo='" + orderNo + '\'' +
                ", productName='" + productName + '\'' +
                ", price=" + price +
                ", number=" + number +
                '}';
    }
}

  1. 使用AmqpAdmin管理组件
@SpringBootTest
@RunWith(SpringRunner.class)
public class Test01 {

    @Autowired
    private AmqpAdmin amqpAdmin;


    @Test
    public void test01() {
        // 声明交换机
        amqpAdmin.declareExchange(new DirectExchange("test_exchange"));
        // 声明队列
        amqpAdmin.declareQueue(new Queue("test_queue"));
        // 绑定交换机与队列
        amqpAdmin.declareBinding(new Binding(
                "test_queue",// 目的地
                Binding.DestinationType.QUEUE,// 绑定规则 队列或者交换机
                "test_exchange",// 绑定交换机
                "test_routingKey",// 绑定路由键
                null// 其他参数

        ));
    }
}

  1. 在Test中使用RabbitTemplate发送消息,消息实体为Order
@RunWith(SpringRunner.class)
@SpringBootTest
public class Test {
    @org.junit.Test
    public void name02() {
        Order order = new Order();
        order.setOrderNo("no0001");
        order.setProductName("a book");
        // 只需要说明发送到哪个交换机,以及绑定关系,交换机在通过绑定发送给具体的队列
        rabbitTemplate.convertAndSend("test_exchange","test_routingKey", order);
    }
}
  1. 监听接收到消息
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AtY48bDb-1688290522500)(src/main/resources/image/接受消息.png)]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/711628.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CentOS ping命令:name or service not known

1.虚拟机网络连接设置为“NAT模式”&#xff0c;且NAT设置 导航栏“编辑”->“虚拟网络编辑器” ->NAT模式->NAT设置 2.网络配置文件 vi /etc/sysconfig/network-scripts/ifcfg-ens33注&#xff1a;IPADDR和NAT设置里面的IP最后一位要不同 3.DNS设置 vi /etc/reso…

自然语言处理: 第四章Seq2Seq

自然语言处理: 第四章Seq2Seq 理论基础 开始之前&#xff0c;首先提出一个问题&#xff0c;电脑是怎么识别人类的命令的&#xff0c;首先人们通过输入代码(编码) &#xff0c;带入输入给计算机然后再经过处理(解码)得到最终的命令。所以可以看到这其实是一个编码 解码的过程…

lesson10 Zigbee组播通信原理

目录 Zigbee组播通信原理 实验原理 实验过程 实验设计 发送模块 接收模块 实验现象 组播通信总结 Zigbee组播通信原理 实验原理 1、组播通信&#xff1a;在Zigbee无线网络里&#xff0c;模块可以进行分组来标记。发送的模块如果发送的组号和网络里标记模块的组号相对应…

被偷走的文件

也是一道流量解析题目 既然是文件被盗走&#xff0c;可能跟文件传输协议ftp有关&#xff0c;过滤一下ftp 跟踪流后发现有一个flag.rar文件&#xff0c;是内嵌的吗&#xff1f; 那说明应该也可以利用binwal分出来吧 分离出来的rar文件需要密码&#xff0c;拿去爆破一下&#xff…

03_ES6

ES6(在js中进行操作) 使用var声明变量的弊端 var 声明的变量有预解析&#xff0c;造成逻辑混乱&#xff0c;可以先使⽤&#xff0c;后声明,undefined var 可以重复定义同⼀个变量&#xff0c;第二个会修改变量的值 var ⽤在 for 循环条件中&#xff0c;造成 for 循环的污染的…

【八股】【C++】(三)STL

这里写目录标题 STL定义一、容器概念&#xff08;1&#xff09;vector如何避免扩容导致效率低为什么是1.5或2扩容怎么找某vector或者list的倒数第二个元素vector如何释放空间[] 下标检查 &#xff08;2&#xff09;deque&#xff08;3&#xff09;stack&#xff08;4&#xff0…

如何通过Python下载GSMap数据集(解决.dat无法打开的问题)?

目录 01 前言 02 GSMap-MVK的存储方式和数据集介绍 03 代码实现 01 前言 这么晚了我还是希望将这篇博客写一下&#xff0c;记录生活。 我所下载的数据集为GSMap-MVK数据集&#xff0c;延迟大概2.5月左右我记得.边下载我就想着先处理着吧。 例如&#xff0c;其中一个文件如…

HOT38-翻转二叉树

leetcode原题链接&#xff1a;翻转二叉树 题目描述 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1]示例 2&#xff1a; 输入&#xff1a;…

华为OD机试真题B卷 Python 实现【小朋友排队】,附详细解题思路

目录 一、题目描述二、输入描述三、输出描述四、解题思路五、Python算法源码六、效果展示1、输入2、输出 一、题目描述 小明今年升学到了小学1年级&#xff0c;来到新班级后&#xff0c;发现其他小朋友身高参差不齐&#xff0c;然后就想基于每个小朋友和自己的身高差&#xff…

postgresql内核分析 spinlock与lwlock原理与实现机制

​专栏内容&#xff1a; postgresql内核源码分析 手写数据库toadb 并发编程 个人主页&#xff1a;我的主页 座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物. 概述 在postgresql 中&#xff0c;有大量的并发同步&#xff0…

浅谈容器技术之Podman

1.Podman容器简介 Podman&#xff08;Pod Manager&#xff09;是一个由RedHat公司推出的容器管理工具&#xff0c;它的定位就是 Docker 的替代品&#xff0c;在使用上与Docker 的体验类似。Podman源于CRI-O项目&#xff0c;可以直接访问 OCI 的实现&#xff08;如 runC&#x…

【Unity实战】复刻实现经典2d平台跳跃游戏《蔚蓝 Celeste》(附工程源码)

文章目录 前言蔚蓝欣赏实现1. 移动2. 跳跃3. 滑动4. 爬墙5. 蹬墙跳6. 移动优化7. 粒子效果8. 角色环境素材9. 编写角色动画控制10. Tilemap绘制地图环境11. 环境粒子特效12. 冲锋残影效果13. 屏幕震动效果14. 涟漪效果 最终效果工程源码参考完结 前言 《蔚蓝》是一款备受好评的…

信号与系统复习笔记——通讯系统

信号与系统复习笔记——通讯系统 复指数与正弦幅度调制 y ( t ) x ( t ) c ( t ) y(t) x(t)c(t) y(t)x(t)c(t) 上式称为调制&#xff0c;其中 x ( t ) x(t) x(t) 称为 调制信号 &#xff0c;而 c ( t ) c(t) c(t) 称为 载波信号 &#xff0c; y ( t ) y(t) y(t) 称为 已…

Redis高可用(主从复制、哨兵模式和Cluster集群)

文章目录 一、Redis高可用1.持久化2.主从复制3.哨兵4.Cluster集群 二、主从复制1.概念2.作用3.主从复制流程4.配置主从复制 三、哨兵模式1.功能2.作用3.组成4.故障转移机制7.故障模拟8.恢复故障节点 四、Cluster群集1.简介2.作用&#xff08;1&#xff09;数据分区&#xff08;…

Redis常用数据类型

Redis 哈希(Hash)&#x1f349; Redis hash 是一个 string 类型的 field&#xff08;字段&#xff09; 和 value&#xff08;值&#xff09; 的映射表&#xff0c;hash 特别适合用于存储对象。 Redis 中每个 hash 可以存储 232 - 1 键值对&#xff08;40多亿&#xff09; 它…

如何动手用js自己写一个分页?

实现效果 实现代码 function generateTableHead() {const tableHead document.getElementById(table-head);tableHead.innerHTML ;// 添加复选框列的表头const checkboxHead document.createElement(th);const checkbox document.createElement(input);checkbox.type che…

项目部署

#修改表的编码 alter table t_course convert to character set utf8 show create table t_course启动docker&#xff1a; service docker startdocker创建redis设置密码&#xff1a; docker pull redis docker run --name my-redis -p 6379:6379 -e REDIS_PASSWORD<pass…

【大数据趋势】7月2日 汇率,美澳,恒指期货的大数据趋势概率分析。

数据源头之一 : 汇率变化 从程序模拟趋势来看&#xff0c;如果没有干预&#xff0c;极大概率要试探顶部7.375的位置。【位置1】从长期趋势来看&#xff0c;在一个上升通道中长期震荡上行&#xff0c;所以正常应该走2.2的路径【趋势2.2】 因为这轮上涨的动能很大&#xff0c;所…

join on 后面的and 与where 的区别及用法

--- 先把数据导入数据库 CREATE TABLE test_join_where_a ( aid int(0) NOT NULL, aname varchar(255) , atimedate datetime(0) , ascore varchar(255) ); INSERT INTO test_join_where_a(aid, aname, atimedate, ascore) VALUES (1, 张三, 2023-05-03 01:13:30, 8…

环境变量的配置

在我上一篇文章中有写到&#xff0c;在编译和运行Hello World这个文档的时候要使用java.c和java这俩个工具&#xff0c;但是我们却没有转换到这俩个工具所在的磁盘位置&#xff0c;而是直接调用了&#xff0c;那么是怎么实现这一功能的嘞&#xff0c;就有下面的理解 首先wine打…