RabbitMQ的快速入门

news2024/11/16 11:29:36

目录

前言

1. 安装RabbitMQ

2.基本结构

3. RabbitMQ消息模型

​​​​​​4. 入门案例  

4.1 publisher实现

4.2 consumer实现

4.3 总结


前言

RabbitMQ是一套开源(MPL)的消息队列服务软件,是由 LShift 提供的一个 Advanced Message Queuing Protocol (AMQP) 的开源实现,由以高性能、健壮以及可伸缩性出名的Erlang写成。

1. 安装RabbitMQ

可以参考我的Docker部署RabbitMQ指南来操作。

2.基本结构

MQ的基本结构:

RabbitMQ中的一些角色:

  • publisher:生产者,事件提供者
  • consumer:消费者,事件订阅者
  • exchange:交换机,负责消息路由
  • queue:队列,存储消息
  • virtualHost:虚拟主机,隔离不同租户的exchange、queue、消息的隔离

3. RabbitMQ消息模型

RabbitMQ官网​​​​​​​提供了5个跟消息发送相关的Demo示例,对应不同的消息模型:

  • 基本消息队列(BasicQueue):

  • 工作消息队列(WorkQueue): 

  • 发布订阅(Publish、Subscribe),由根据交换机类型不同分为三种:

         1.Fanout Exchange:广播 

         

         2.Direct Exchange:路由

        

        3.Topic Exchange:主题

        ​ 

​​​​​​4. 入门案例  

简单队列模式的模型图:

  

官方的HelloWorld是基于最基础的消息队列模型来实现的,只包含三个角色:

  •  publisher:消息发布者,将消息发送到队列queue
  • queue:消息队列,负责接受并缓存消息
  • consumer:订阅队列,处理队列中的消息 

我这里有一份示例代码,有需要的话,可以去最后部分下载:

  

包括三部分:

  • mq-demo:父工程,管理项目依赖
  • publisher:消息的发送者
  • consumer:消息的消费者

4.1 publisher实现

思路:

  • 建立连接
  • 创建Channel
  • 声明队列
  • 发送消息
  • 关闭连接和channel

代码实现:

package cn.itcast.mq.helloworld;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import org.junit.Test;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

public class PublisherTest {
    @Test
    public void testSendMessage() throws IOException, TimeoutException {
        // 1.建立连接
        ConnectionFactory factory = new ConnectionFactory();
        // 1.1.设置连接参数,分别是:主机IP、端口号、vhost、用户名、密码
        factory.setHost("你的RabbitMQ服务器IP");
        factory.setPort(5672);
        factory.setVirtualHost("/");
        factory.setUsername("lyf");
        factory.setPassword("123456");
        // 1.2.建立连接
        Connection connection = factory.newConnection();

        // 2.创建通道Channel
        Channel channel = connection.createChannel();

        // 3.创建队列
        String queueName = "simple.queue";
        channel.queueDeclare(queueName, false, false, false, null);

        // 4.发送消息
        String message = "hello, rabbitmq!";
        channel.basicPublish("", queueName, null, message.getBytes());
        System.out.println("发送消息成功:【" + message + "】");

        // 5.关闭通道和连接
        channel.close();
        connection.close();

    }
}

接下来,我们来debug一步步讲解一下:

首先要想发送消息,就要跟MQ建立连接,而建立连接首先就是要创建连接工厂(ConnectionFactory):

  

连接工厂(ConnectionFactory)创建之后,需要设置一些信息。首先是MQ主机的IP地址,因为我的RabbitMQ是安装在我的虚拟机上的,所以这里是我的虚拟机的IP地址,你根据自己的实际情况来填写,如果安装虚拟机上,就填写虚拟机的IP,安装在主机上,就填写本地的IP:

  

这里是MQ的通信端口5672,MQ还有一个常用的管理平台的端口是15672,这两个端口不要搞错了:

  

接下来,走到的就是设置虚拟主机,每一个用户都有自己的虚拟主机,所以他是跟下面的用户名是对应的:

  

如果,你不知道自己用户的虚拟主机是多少,可以登录自己的RabbitMQ管理平台看看,我这里lyf这个用户名对应的虚拟主机就是 “/”:

  

下面的用户和密码设置,我就直接过了。只要跟虚拟主机是对应的就可以了。接下来, 就是将上面的设置信息用上之后,创建一个跟MQ的连接:

  

上面这一步走完之后,我们可以在RabbitMQ的管理平台看到新创建的连接:

  

创建了连接之后,就是创建一个消息的通道:

    

这一行执行过后,我们就可以在RabbitMQ的管理界面看到新创建的通道(channel)了:

  

在通道创建之后,就是创建一个队列,声明了队列的名称,然后声明一个队列: 

    

走完上面两步,我们就可以在MQ的管理平台上看见创建出来的队列:

  

有了队列之后是不是就可以开始发消息了,将string的消息转成字节(byte)方式发送了:

  

后面的就是打印,关闭通道关闭连接,我就直接把代码放行了,我们可以看到这里已经发送消息成功。

  

然后去MQ管理平台,可以看到刚刚发送成功的消息:

  

这时候消息发送者已经完成了自己的事情。不会管,谁来接收消息,这就是解耦合。

4.2 consumer实现

思路:

  • 建立连接
  • 创建Channel
  • 声明队列
  • 订阅消息

代码实现:

package cn.itcast.mq.helloworld;

import com.rabbitmq.client.*;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

public class ConsumerTest {

    public static void main(String[] args) throws IOException, TimeoutException {
        // 1.建立连接
        ConnectionFactory factory = new ConnectionFactory();
        // 1.1.设置连接参数,分别是:主机IP、端口号、vhost、用户名、密码
        factory.setHost("你的RabbitMQ服务器IP");
        factory.setPort(5672);
        factory.setVirtualHost("/");
        factory.setUsername("lyf");
        factory.setPassword("123456");
        // 1.2.建立连接
        Connection connection = factory.newConnection();

        // 2.创建通道Channel
        Channel channel = connection.createChannel();

        // 3.创建队列
        String queueName = "simple.queue";
        channel.queueDeclare(queueName, false, false, false, null);

        // 4.订阅消息
        channel.basicConsume(queueName, true, new DefaultConsumer(channel){
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope,
                                       AMQP.BasicProperties properties, byte[] body) throws IOException {
                // 5.处理消息
                String message = new String(body);
                System.out.println("接收到消息:【" + message + "】");
            }
        });
        System.out.println("等待接收消息。。。。");
    }
}

注意:consumer是不需要关闭通道,关闭连接的,因为在实际的开发过程中,消费者要一直关注publisher是否有发送消息,如果通道和连接关闭了,就像一次性的,处理一次就不再处理了。

consumer创建连接,设置参数跟publisher都是一样的,就不细讲了。consumer创建队列是因为在实际开发中,如果是消费者先执行的话,就会出现报错的情况,所以确保有这个队列:

    

我们debug走过了,来看一下MQ的管理平台:

  

发现只要发布者已经创建了队列的话,消费者并不会重新创建一个新的队列。

  

这里就是我们订阅消息的具体逻辑部分,这是一个匿名的内部类。这里面就像是JS里的回调函数一样,把处理的逻辑挂在队列上,当这个队列一旦有了消息,就会执行这一部分。放行之后,在控制台我们可以看到:

  

说明匿名内部类是一个异步处理的逻辑,在前面都执行完了之后,MQ的队列里面只要有消息了之后,才会执行里面的逻辑。更加说明了MQ的异步机制。

然后我们去MQ的管理平台去看一下:

  

这时候可以看到,消息已经被处理完了。说明只要我这消息被消费者消费,就会被删除。就是所谓的阅后即焚。

4.3 总结

基本消息队列的消息发送流程:

  1. 建立connection
  2. 创建channel
  3. 利用channel声明队列
  4. 利用channel向队列发送消息

基本消息队列的消息接收流程: 

  1. 建立connection
  2. 创建channel
  3. 利用channel声明队
  4. 定义consumer的消费行为handleDelivery()
  5. 利用channel将消费者与队列绑定

5. 代码分享

链接: https://pan.baidu.com/s/1TOVZIJXXiSsRF3clun75TQ?pwd=1234

提取码: 1234 

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

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

相关文章

达梦数据库的系统视图v$cachesql

达梦数据库的系统视图v$cachesql 达梦数据库的系统视图V$CACHESQL的主要作用是提供缓冲区中SQL语句的信息,在 ini 参数 USE_PLN_POOL !0 时才统计。通过查询这个视图,用户可以了解SQL语句在缓冲区中的执行情况,包括SQL节点的类型、进入次数、…

滚珠丝杆与丝杆支撑座:稳定性与精度的双重保障

丝杆支撑座是连接滚珠丝杆与电机的轴承,采用优质的轴承能确保支撑座与滚珠丝杆之间的刚性平衡。那么,滚珠丝杆搭连接杆支撑座有哪些优缺点呢? 正常情况下,丝杆支撑座能够提供稳定的支撑力,确保滚珠丝杆在复杂工况下保持…

使用PasteSpider实现类似Jenkins的功能,让你的2G服务器也可以飞起

获取你接触过Jenkins,在我理解就是拉取源码,然后构建成镜像,最后启动容器! 这个步骤你在PasteSpider上也可以实现,以下案例使用svn作为源码管理 如果你使用git作为源码管理,道理差不多 以我的代码为例 …

假期BUUCTF小练习3

文章目录 [极客大挑战 2019]BuyFlag[BJDCTF2020]Easy MD5[HCTF 2018]admin第一种方法 直接登录第二种方法 flack session伪造第三种方法Unicode欺骗 [MRCTF2020]你传你🐎呢[护网杯 2018]easy_tornadoSSTI注入 [ZJCTF 2019]NiZhuanSiWei [极客大挑战 2019]BuyFlag 一…

好用的AI智能写作助手,创作者必备

随着科技的不断发展,人工智能(AI)在各个领域都起到了革命性的作用。在写作领域,AI智能写作助手已经成为了创作者们的必备工具。这些智能助手通过强大的自然语言处理能力和深度学习算法,能够帮助创作者们提高写作效率、…

网络安全领域含金量最高的5大赛事,每个网安人的梦!

做网络安全一定要知道的5大赛事,含金量贼高,如果你能拿奖,国内大厂随你挑,几乎是每个有志网安人的梦! 一、 DEF CON CTF(DEF CON Capture the Flag) DEF CON CTF是DEF CON黑帽大会上的一项著名…

grep工具的使用

grep [options]…… pattern [file]…… 工作方式: grep 在一个或者多个文件中搜索字符串模板,如果模板中包括空格,需要使用引号引起来,模 板后的所有字符串会被看作是文件名。 工作结果:如果模板搜索成功&#xf…

算法力扣刷题记录 六十三【回溯章节开篇】

前言 开始回溯章节学习。 在二叉树中预先体会了回溯。那么回溯单独来说是怎么回事? 一、基础知识学习 回溯基础知识参考链接 二、组合问题 2.1题目阅读 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答…

C#--DirectShowLib 关闭自动白平衡和自动曝光时间

一、前言 因项目需要需关闭相机自身的自动白平衡和自动曝光时间,统统设定为恒定值,开始实验了opencvCvSharp,但是不起作用,故实验了更底层的 DirectShowLib ,可成功关闭相机自带的自动白平衡和自动曝光时间&#xff0c…

用script实现的一个简易计算机

目录 一、计算器原理 二、源码 三、结果展示 四、不足与改进 一、计算器原理 首先我们列出想象中简易计算器的样子: 虽然画的磕碜但是应该不影响下面的操作hh 首先想到用表格形式在网页中表示它,是一个5行4列的表格,接着要实现计算器的…

ShardingSphere中的ShardingJDBC常见分片算法的实现

文章目录 ShardingJDBC快速入门修改雪花算法和分表策略核心概念分片算法简单INLINE分片算法STANDARD标准分片算法COMPLEX_INLINE复杂分片算法CLASS_BASED自定义分片算法HINT_INLINE强制分片算法 注意事项 ShardingJDBC Git地址 快速入门 现在我存在两个数据库,并…

【传知代码】Flan-T5 使用指南(论文复现)

当今,自然语言处理技术正在以前所未有的速度和精度发展。在这个领域中,Flan-T5作为一种新兴的预训练语言模型,正吸引着广泛的关注和应用。Flan-T5不仅仅是一个强大的文本生成工具,它还能通过提供高效的语义理解和多任务学习能力&a…

【java计算机毕设】智慧校园管理系统MySQL springboot vue HTML maven寒暑假小组设计项目源码作业带文档安装环境

目录 1项目功能 2项目介绍 3项目地址 1项目功能 【java计算机毕设】智慧校园管理系统MySQL springboot vue HTML maven寒暑假小组设计项目源码作业带文档安装环境 2项目介绍 系统功能: 智慧校园管理系统包括管理员、用户、老师三种角色。 管理员功能包括个人中心…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 团队关系判定(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM金牌🏅️团队| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,支持题…

大语言模型学习笔记 LangChain简述

一、简述 LangChain是一个由大型语言模型 (LLM) 驱动的应用程序开发框架。LangChain 旨在为开发人员提供一系列功能,利用大型语言模型简化应用程序的创建和管理。 LangChain 可充当几乎所有 LLM 的通用接口,提供集中式开发环境来构建 LLM 应用程序并将其…

二十天刷leetcode【hot100】算法- day1[前端Typescript]

哈希表 1. 两数之和 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你…

适用于个人使用的十大数据恢复工具:综合指南

有许多数据恢复工具和软件可用于帮助恢复丢失或损坏的文件。通过了解您的需求并考虑这里探讨的工具,您将能够选择最佳的数据恢复软件,并希望找回您丢失的宝藏。在本综合指南中,我们将探索个人使用的十大数据恢复工具,重点介绍它们…

ESP32人脸识别开发- 基础介绍(一)

一、ESP32人脸识别的方案介绍 目前ESP32和ESP32S3都是支持的,官方推的开发板有两种,一种 ESP-EYE ,没有LCD 另一种是ESP32S3-EYE,有带LCD屏 二、ESP32人脸识别选用ESP32的优势 ESP32S3带AI 加速功能,在人脸识别的速度是比ESP32快了不少 | S…

鸿蒙 IM 即时通讯开发实践,融云 IM HarmonyOS NEXT 版

融云完成针对“纯血鸿蒙”操作系统的 SDK 研发,HarmonyOS NEXT 版融云 IM SDK 已上线,开发者可在“鸿蒙生态伙伴 SDK 市场”查询使用。 发挥 20 年通信行业技术积累和领创品牌效应,融云为社交、娱乐、游戏、电商、出行、医疗等各行业提供专业…

【深澜计费管理系统存在任意文件读取漏洞复现和检测脚本】

目录 一、漏洞介绍 二、poc利用 三、批量检测脚本 一、漏洞介绍 深澜计费管理系统存在任意文件读取漏洞。攻击者可以利用这个漏洞读取服务器上的任何文件,包括配置文件、源代码文件和敏感数据等。 二、poc利用 360 quake: favicon: "1fc27943c1f0d9b54cc…