RabbitMQ 简单模型

news2024/9/28 17:24:15

MQ引言

1.1 什么是MQ

​ MQ(Message Quene) : 翻译为消息队列,通过典型的生产者和消费者模型,生产者不断向消息队列中生产消息,消费者不断的从队列中获取消息。因为消息的生产和消费都是异步的,而且只关心消息的发送和接收,没有业务逻辑的侵入,轻松的实现系统间解耦。别名为 消息中间件通过利用高效可靠的消息传递机制进行平台无关的数据交流并基于数据通信来进行分布式系统的集成。

1.2 不同的MQ产品的特点

image-20211122092650436

​ ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。它是一个完全支持JMS规范的的消息中间件。丰富的API,多种集群架构模式让ActiveMQ在业界成为老牌的消息中间件,在中小型企业 颇受欢迎!

image-20211122092706884

​ Kafka是LinkedIn开源的分布式发布-订阅消息系统,目前归属于Apache顶级项目。Kafka主要特点是基于Pull的模式来处理消息消费,追求高吞吐量,一开始的目的就是用于日志收集和传输。0.8版本开始支持复制,不支持事务,对消息的重复、丢失、错误没有严格要求,适合产生大量数据的互联网服务的数据收集业务。

image-20211122092730452

​ RocketMQ是阿里开源的消息中间件,它是纯Java开发,具有高吞吐量、高可用性、适合大规模分布式系统应用的特点。RocketMQ思路起源于Kafka,但并不是Kafka的一个Copy,它对消息的可靠传输及事务性做了优化,目前在阿里集团被广泛应用于交 易、充值、流计算、消息推送、日志流式处理、binglog分发等场景。

image-20211122092745948

  • RabbitMQ是使用Erlang语言开发的开源消息队列系统,基于AMQP协议来实现。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。AMQP协议更多用在企业系统内对数据一致性、稳定性和可靠性要求很高的场景,对性能和吞吐量的要求还在其次。
  • RabbitMQ比Kafka可靠,Kafka更适合IO高吞吐的处理,一般应用在大数据日志处理或对实时性(少量延迟),可靠性(少量丢数据)要求稍低的场景使用,比如ELK日志收集。

RabbitMQ安装

​ https://blog.csdn.net/unique_perfect/article/details/108643804

支持的消息模型

2020103018025840

20201030180315852

实战

  1. 引入依赖

    		<!--引入rabbitmq相关依赖-->
            <dependency>
                <groupId>com.rabbitmq</groupId>
                <artifactId>amqp-client</artifactId>
                <version>5.7.2</version>
            </dependency>
    
  2. 创建新的虚拟主机及用户,将虚拟主机分配给用户。

    image-20211122103814772

  3. 生产者代码

    /**
     * 生产者
     */
    public class Provider {
    
        /**
         * 生产消息
         */
        @Test
        public void sendMessage() throws IOException, TimeoutException {
    
            //创建连接MQ的工厂对象
            ConnectionFactory connectionFactory = new ConnectionFactory();
    
            //设置连接属性
            connectionFactory.setHost("152.136.194.158");
            connectionFactory.setPort(5672);
            connectionFactory.setVirtualHost("ems");
            connectionFactory.setUsername("ems");
            connectionFactory.setPassword("ems");
    
            //获取连接对象
            Connection connection = connectionFactory.newConnection();
    
            //获取连接中通道
            Channel channel = connection.createChannel();
    
            /**
             * 通道绑定队列
             * 队列名称 不存在自动创建
             * 是否持久化
             * 是否独占队列
             * 是否在消费完成后自动删除队列
             * 附加参数
             */
            channel.queueDeclare("hello",false,false,false,null);
    
            /**
             * 发布消息
             * 1. 交换机名称
             * 2. 队列名称
             * 3. 传递消息额外设置
             * 4. 具体消息
             */
            channel.basicPublish("","hello",null,"hello rabbitmq".getBytes());
            
            channel.close();
            connection.close();
    
        }
    
    }
    

    执行之后,我们发现在web管理控制台中有了hello队列,并且有三条消息(运行了三次)

    image-20211122110053084

  4. 消费者代码

    /**
     * 消费者
     */
    public class Customer {
    
        public static void main(String[] args) throws IOException, TimeoutException {
    
            //创建连接MQ的工厂对象
            ConnectionFactory connectionFactory = new ConnectionFactory();
    
            //设置连接属性
            connectionFactory.setHost("152.136.194.158");
            connectionFactory.setPort(5672);
            connectionFactory.setVirtualHost("ems");
            connectionFactory.setUsername("ems");
            connectionFactory.setPassword("ems");
    
            //获取连接对象
            Connection connection = connectionFactory.newConnection();
    
            //获取连接中通道
            Channel channel = connection.createChannel();
    
            /**
             * 通道绑定队列
             * 队列名称 不存在自动创建
             * 是否持久化
             * 是否独占队列
             * 是否在消费完成后自动删除队列
             * 附加参数
             */
            channel.queueDeclare("hello",false,false,false,null);
    
            /**
             * 消费消息
             * 1. 消费的队列
             * 2. 开始消息的自动确认机制
             * 3. 回调接口 重写该接口的handleDelivery方法 处理消息
             */
            channel.basicConsume("hello",true,new DefaultConsumer(channel){
    
                @Override
                public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                    System.out.println("消费者拿到的消息:"+ new String(body) );
                }
            });
    
        }
    
    }
    
  5. 启动消费者,然后启动生产者,消费者就会拿到对应的消息。

    image-20211122111923312

  6. 封装获取连接工具类

    /**
     * 单例模式 饿汉式
     */
    public class RabbitMQUtils {
    
    
        private static ConnectionFactory connectionFactory;
    
        static {
            connectionFactory = new ConnectionFactory();
            //设置连接属性
            connectionFactory.setHost("152.136.194.158");
            connectionFactory.setPort(5672);
            connectionFactory.setVirtualHost("ems");
            connectionFactory.setUsername("ems");
            connectionFactory.setPassword("ems");
        }
    
        /**
         * 获取连接
         * @return
         */
        public static Connection getConnection(){
    
            try {
                return connectionFactory.newConnection();
            } catch (IOException | TimeoutException e) {
                e.printStackTrace();
            }
            return null;
        }
    
        public static void close(Connection connection, Channel channel){
    
            try {
                if(channel != null) channel.close();
                if(connection != null) connection.close();
    
            }catch (Exception e){
                e.printStackTrace();
            }
    
        }
    
    }
    

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

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

相关文章

chatGPT+Midjourney制作绘画本

chatGPTMidjourney制作绘画本 灵感来源&#xff1a;https://www.bilibili.com/video/BV1N24y1F7ga/?spm_id_from888.80997.embed_other.whitelist&vd_source6dd97671c42eb7cf111063714216bd0b 最终效果&#xff1a; 绘本故事 故事塑造能力弱的人可以使用chatGPT来帮助编…

wait/waitpid函数等待子进程状态发生改变

&#x1f38a;【进程通信与并发】专题正在持续更新中&#xff0c;进程&#xff0c;线程&#xff0c;IPC&#xff0c;线程池等的创建原理与运用✨&#xff0c;欢迎大家前往订阅本专题&#xff0c;获取更多详细信息哦&#x1f38f;&#x1f38f;&#x1f38f; &#x1fa94;本系列…

【自看】2023前端面试上岸手册——VUE部分

目录 Vue 的基本原理双向数据绑定的原理MVVM、MVC、MVP 的区别slot 是什么&#xff1f;有什么作用&#xff1f;原理是什么&#xff1f;\$nextTick 原理及作用Vue 单页应用与多页应用的区别Vue 中封装的数组方法有哪些&#xff0c;其如何实现页面更新Vue data 中某一个属性的值发…

商品管理系统【控制台+MySQL】(Java课设)

系统类型 控制台类型Mysql数据库存储数据 使用范围 适合作为Java课设&#xff01;&#xff01;&#xff01; 部署环境 jdk1.8Mysql8.0Idea或eclipsejdbc 运行效果 本系统源码地址&#xff1a;https://download.csdn.net/download/qq_50954361/87738976 更多系统资源库地…

辅助驾驶功能开发-功能规范篇(16)-2-领航辅助系统NAP-匝道跟车基础功能

书接上回 2.3.3匝道辅助驾驶 匝道辅助驾驶功能根据导航引导在ODD范围内辅助驾驶车辆进出匝道,主动变道并入或开出主路,并可根据导航路线引导车辆通过跨高速连接路。 前置条件: 1)驾驶员设置导航目的地及导航路线 2)开启辅助驾驶功能,系统进入NOA功能 2.3.3.1.上下匝道…

如何设计一个可扩展的优惠券功能

本文主要分享了如何设计一个可扩展的优惠券功能。 一、功能特性介绍 1.每个条件的代码独立&#xff0c;相当于单独的实现类实现接口&#xff0c;就能通过配置添加到优惠券条件校验当中&#xff0c;支持多种条件灵活组合 2.新增一种使用条件可以不修改核心流程代码&#xff0…

Angular 与PDF之二:打印预览的实现

如何在angular中实现打印和预览pdf的功能, 使用print.js这个包就可实现这个功能 Print.js介绍 Print.js可以打印pdf文件&#xff0c;html元素&#xff0c;图片。官网 https://printjs.crabbly.com/ Print.js使用 首先新建一个angular项目&#xff0c;在项目里下载print.js n…

[JS每M日N练] [格物] - 你所不知道的toString

文章目录 导读Object.prototype.toString常见类型转换结果Object.toString ! Object.prototype.toString对Object.prototype.toString.call(obj)的理解 .toString.toString TypeError误区tostring被改写了定义在原型链的什么位置上方法重写 文章小结参考资料 导读 开发过程中经…

同时使用注解和 xml 的方式引用 dubbo 服务产生的异常问题排查实战

文章目录 一、现象二、问题排查三、结论四、解决方案 一、现象 使用 nacos 作注册中心的线上 dubbo 消费端应用每隔 1 分钟就会抛出以下异常&#xff08;为使描述简单化&#xff0c;文章中使用本地 demo 来复现&#xff09;&#xff0c;该异常表示无法连接到 172.17.0.1:20881…

JavaWeb( 二 ) URL

1.4.URL统一资源定位符 URL代表Uniform Resource Locator 统一资源定位符&#xff0c;也叫 URL地址 。是用于标识和定位Web上资源的地址&#xff0c;通常用于在Web浏览器中访问网站和文件。 URL由若干部分组成&#xff0c;scheme:// host : port / path 例如&#xff1a; htt…

Contest3111 - 计科2101~2104算法设计与分析上机作业07

问题 A: 有重复元素的排列问题 题目描述 设R{ r 1 , r 2 , …, r n }是要进行排列的n个元素。其中元素r 1 , r 2 , …, r n 可能相同。试设计一个算法&#xff0c; 列出R的所有不同排列。给定n 以及待排列的n 个元素。计算出这n 个元素的所有不同排列。 输入 第1 行是元素个…

android四大组件之一-Activity实现原理分析

前言&#xff1a; 这篇文章是我花费时间最久的一篇文章&#xff0c;整整的两个月。整个流程繁琐是一个方面的原因&#xff0c;另外一个原因是我想尽可能的把整个流程的逻辑尽可能详细的一一描述出来&#xff0c;以及结合到我们项目中遇到的一些问题来进行解释&#xff0c;毕竟…

【五一创作】VS+Qt主界面内嵌自定义控件的四种方法以及不同自定义控件数据交互

前言 在Qt界面开发过程中&#xff0c;一个主界面或者主窗口看成是各个控件排列组合后的集合&#xff0c;对于一些项目而言&#xff0c;有些常用的控件可以封装成自己想要的控件样式并且复用&#xff0c;比如说&#xff0c;log显示控件&#xff0c;图像/视频显示控件等&#xf…

【ros2】ros melodic迁移到ros2 dashing过程中碰到的问题及解决方法

序言 总结踩坑经历&#xff0c;以利他人 1. error: forming pointer to reference type … & 报错原因&#xff1a; ros2回调函数的参数不能是引用形式 &&#xff0c;需要去除& 解决方法&#xff1a; 如果是指针引用&#xff0c;直接去除引用 void Callback(con…

【Java开发】Spring Cloud 11:Gateway 配置 ssl 证书(https、http、域名访问)

最近研究给微服务项目配置 ssl 证书&#xff0c;如此才可以对接微信小程序&#xff08;需要使用 https 请求&#xff09;。传统单体项目来说&#xff0c;首先往项目中添加证书文件&#xff0c;然后在配置文件中配置 ssl 证书路径、密码等相关信息&#xff1b;那么微服务这么多项…

机器学习强基计划8-5:图解局部线性嵌入LLE算法(附Python实现)

目录 0 写在前面1 流形学习2 局部线性嵌入算法2.1 什么是局部线性嵌入&#xff1f;2.2 算法原理推导 3 Python实现3.1 算法流程3.2 核心代码3.3 可视化 0 写在前面 机器学习强基计划聚焦深度和广度&#xff0c;加深对机器学习模型的理解与应用。“深”在详细推导算法模型背后的…

基于学生成绩管理系统(附源代码及数据库)

基于Ecplise&#xff0c;jsp的学生成绩管理系统 目录 登录页面 系统主页 管理员账号管理 学生查询 课程管理 成绩管理 后台数据库 源代码下载&#xff08;含数据库&#xff09; 毕设项目专栏 分为以下四大板块&#xff1a; 系统用户管理: 包含管理员账号管理&#…

【一起撸个DL框架】5 实现:自适应线性单元

CSDN个人主页&#xff1a;清风莫追欢迎关注本专栏&#xff1a;《一起撸个DL框架》GitHub获取源码&#xff1a;https://github.com/flying-forever/OurDL 文章目录 5 实现&#xff1a;自适应线性单元&#x1f347;1 简介2 损失函数2.1 梯度下降法2.2 补充 3 整理项目结构4 损失函…

第二十七章 Unity碰撞体Collision(下)

本章节我们继续研究碰撞体&#xff0c;并且探索一下碰撞体与刚体之间的联系。我们回到之前的工程&#xff0c;然后给我们的紫色球体Sphere1也添加一个刚体组件。如下所示 此时&#xff0c;两个球体都具备了碰撞体和刚体组件。接下来&#xff0c;我们Play运行查看效果 我们发现&…

第二十六章 Unity碰撞体Collision(上)

在游戏世界中&#xff0c;游戏物体之间的交互都是通过“碰撞接触”来进行交互的。例如&#xff0c;攻击怪物则是主角与怪物的碰撞&#xff0c;触发机关则是主角与机关的碰撞。在DirectX课程中&#xff0c;我们也大致介绍过有关碰撞检测的内容。游戏世界中的3D模型的形状是非常复…