03-快速上手RabbitMQ的5种消息模型

RabbitMQ

RabbitMQ是基于Erlang语言开发的开源消息通信中间件,有几个常见概念

  • connections(连接): 将来publisher(消息的发送者)或者consumer(消息的接收者)都需要先与MQ建立连接

  • channel(通道): 建立连接后需要创建通道,生产者和消费者就是基于通道完成消息的发送和接收

  • exchange(交换机): 路由消息到队列中

  • queue(队列):缓存消息(二进制数据块)

  • virtual host(虚拟主机): 对queue,exchange等资源逻辑分组隔离防止不同用户操作MQ时发生冲突,一般每个用户都有自己独享的虚拟主机(默认只有"/")

在这里插入图片描述

5种消息模型

RabbitMQ官方提供了5个不同的Demo实例,对应了不同的消息模型

  • 基于队列完成消息的发送和接收: 基本消息类型(BasicQueue), 工作消息队列(WorkQueue)
  • 发布订阅模型(Publish,Subscribe): 基于交换机的类型不同分为广播(Fanout Exchange),路由(Direct Exchange),主题(Topic Exchange)

需求: 基于最基础的消息队列模型实现HelloWorld案例

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

在这里插入图片描述

第一步: 创建父工程mq-demo用来管理项目依赖,创建子模块publisher(消息的发送者)consumer(消息的消费者)

第二步: 在publisher模块的测试类中编写消息发送流程的逻辑代码

  • 建立connection–>创建channe–>使用channel声明队列–>使用channel向声明的队列发送消息(底层需要把消息转成二进制传输)
public class PublisherTest {@Testpublic void testSendMessage() throws IOException, TimeoutException {// 1.建立连接ConnectionFactory factory = new ConnectionFactory();// 1.1.设置连接MQ的参数主机名、消息通信端口号、vhost、用户名、密码factory.setHost("192.168.150.101");factory.setPort(5672);factory.setVirtualHost("/");factory.setUsername("root");factory.setPassword("123456");// 1.2.建立连接Connection connection = factory.newConnection();// 2.创建通道ChannelChannel 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();}
}

第三步: 在consumer模块的测试类中编写消息接收流程的业务逻辑代码

  • 建立connection–>创建channel->使用channel声明队列–>订阅信息(定义消费行为和绑定队列)—>删除队列中的消息(阅后即焚)
  • 订阅信息流程: 定义consumer的消费行为handleDelivery()即接收到消息后要执行的回调函数–>利用channel将消费者与队列绑定
  • 因为消费者和生产者启动的顺序不确定,为了避免寻找的队列可能不存在,所以消费者和生产者都需要各自声明创建队列(无论谁先声明实际只会创建一个队列)
public class ConsumerTest {public static void main(String[] args) throws IOException, TimeoutException {// 1.建立连接ConnectionFactory factory = new ConnectionFactory();// 1.1.设置连接参数,分别是:主机名、端口号、vhost、用户名、密码factory.setHost("192.168.150.101");factory.setPort(5672);factory.setVirtualHost("/");factory.setUsername("root");factory.setPassword("root");// 1.2.建立连接Connection connection = factory.newConnection();// 2.创建通道ChannelChannel channel = connection.createChannel();// 3.声明队列,只有当声明的队列不存在时才会被创建,我们在这里再次声明队列可以防止队列为nullString queueName = "simple.queue";channel.queueDeclare(queueName, false, false, false, null);// 4.订阅消息(定义消费行为和绑定队列)channel.basicConsume(queueName, true, new DefaultConsumer(channel){@Overridepublic void handleDelivery(String consumerTag, Envelope envelope,AMQP.BasicProperties properties, byte[] body) throws IOException {// 5.处理消息(将字节转化为字符串)String message = new String(body);System.out.println("接收到消息:【" + message + "】");}});// 异步执行,只有RabbitMQ把消息发送过来后以上定义的回调函数才会执行System.out.println("等待接收消息....");}
}

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

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

相关文章

django自定义表单

文章目录 django自定义表单两种方式自定义错误信息widgets实例化和初始化处理用户提交的数据验证表单通用类试图使用表单Formset django自定义表单 两种方式 继承Form类继承ModelForm类 from django import forms from .models import Contact# 自定义表单字段 class Contac…

_note_06

1.说一说函数的按地址传递和按值传递,他们的区别是什么? 函数的参数传递方式可以分为按地址传递(也称为按引用传递)和按值传递两种方式。按值传递是指将实际参数的值复制给形式参数,即在函数调用时,实际参数…

探索云原生数据库技术:构建高效可靠的云原生应用

数据库是应用开发中非常重要的组成部分,可以进行数据的存储和管理。随着企业业务向数字化、在线化和智能化的演进过程中,面对指数级递增的海量存储需求和挑战以及业务带来的更多的热点事件、突发流量的挑战,传统的数据库已经很难满足和响应快…

2023年终总结——跌跌撞撞不断修正

目录 一、回顾1.一月,鼓足信心的开始2.二月,焦躁不安3.三月,路还是要一步一步的走4.四月,平平淡淡的前行5.五月,轰轰烈烈的前行6.六月,看事情更底层透彻了7.七月,设计模式升华月8.八月&#xff…

04hive数仓内外部表复杂数据类型与分区分桶

hive内部表和外部表 默认为内部表,外部表的关键字 :external内部表:对应的文件夹就在默认路径下 /user/hive/warehouse/库名.db/外部表:数据文件在哪里都行,无须移动数据 # students.txt 1,Lucy,girl,23 2,Tom,boy,2…

Python实战:Python常用IDE选择

在Python编程的旅程中,选择一个合适的开发环境至关重要。本文将详细介绍三种流行的Python开发环境:PyCharm、VS Code和Jupyter Notebook。我们将探讨它们的特点、安装步骤、基本使用方法,并通过具体的代码示例来展示如何在这些环境中编写和运…

Python中,括号内部的for循环(列表推导式)

在Python中,括号内部的for循环通常用于列表推导式(list comprehension),这是一种简洁创建列表的方式。列表推导式可以使用任何可迭代对象内的元素来创建新的列表元素。 列表推导式的基本语法结构如下: [expression f…

Kafka的分区机制

Kafka的分区机制是其核心功能之一,旨在提高可扩展性和并行处理能力。下面概述了Kafka分区的基本概念和工作原理: Kafka分区基本概念 分区(Partition):Kafka中的主题(Topic)可以细分为多个分区…

政安晨:【深度学习处理实践】(五)—— 初识RNN-循环神经网络

RNN(循环神经网络)是一种在深度学习中常用的神经网络结构,用于处理序列数据。与传统的前馈神经网络不同,RNN通过引入循环连接在网络中保留了历史信息。 RNN中的每个神经元都有一个隐藏状态,它会根据当前输入和前一个时…

Java EE之wait和notify

一.多线程的执行顺序 由于多个线程执行是抢占式执行,就会导致顺序不同,同时就会导致出现问题,就比如俩个线程同时对同一个变量进行修改,我们难以预知执行顺序。 但在实际开发中,我们希望代码按一定的逻辑顺序执行&am…

AI辅助研发:引领科技创新的未来之路

随着人工智能技术的快速发展和广泛应用,AI辅助研发正逐渐成为科技界和工业界的焦点。2024年,作为AI技术进一步成熟的见证者,我们正处于AI辅助研发的黄金时代。从医药研发到汽车设计,从软件开发到材料科学,AI的影响力已…

计算机视觉——P2PNet基于点估计的人群计数原理与C++模型推理

简介 人群计数是计算机视觉领域的一个核心任务,旨在估算静止图像或视频帧中的行人数量。在过去几十年中,研究人员在这个领域投入了大量的精力,并在提高现有主流基准数据集性能方面取得了显著进展。然而,训练卷积神经网络需要大规…

matlab阶段学习笔记小节2

syms定义符号变量 求极限 第二题 第三题 limit(y,n,inf);求的的函数y关于自变量n在无穷处(inf)的极限 exp(2)即指数为2,底为e,也就是e^2 求导数 第一题 log(x)默认是以e为底的指数函数,也就是ln(x). 使用diff(f)对函数进行求…

今日份总结

1&#xff1a;标题 <h1>一级标题</h1> <h2>二级标题</h2> <h3>三级标题</h3> 可以用快捷键&#xff1a;h$*6 (表示一到六级标题) 2&#xff1a;段落 <p>这是一个段落</p> 3&#xff1a;换行 <p>这是一个段落&l…

算法-双指针、BFS与图论-1113. 红与黑

题目 思路 本题相当于问BFS中的当前点所在的区域连通块有多少个 Flood Fill算法 &#xff08;可参考以下链接&#xff1a;洪水覆盖算法(Flood Fill)&#xff1a;颜色填充-CSDN博客&#xff09;本题用DFS实现Flood Fill算法DFS是否需要恢复现场&#xff1a;&#xff08;重要&am…

新IDEA电脑环境设置

1.设置UTF-8 2.Maven 3.JRE选对

【漏洞复现】华三用户自助服务产品dynamiccontent.properties.xhtml接口处存在RCE漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

VUE+HBuilder的uniapp技术路线开发应用使用总结

使用总结 本来想做一个记录日常数据的应用&#xff0c;主要在Android端使用&#xff0c;后来发现在uniapp中使用sqllite数据库不是像原生中那样简单(所以当前准备去进行另一个路线&#xff0c;就是给我使用的电脑都安装一个portalble的服务端&#xff0c;用来记录数据&#xf…

java中使用rabbitmq

文章目录 前言一、引入和配置1.引入2.配置 二、使用1.队列2.发布/订阅2.1 fanout(广播)2.2 direct(Routing/路由)2.3 Topics(主题)2.4 Headers 总结 前言 mq常用于业务解耦、流量削峰和异步通信,rabbitmq是使用范围较广,比较稳定的一款开源产品,接下来我们使用springboot的sta…

C#(C Sharp)学习笔记_变量常量与作用域【十二】

变量 变量是用来存储数据值的标识符。你可以将变量视为内存中的一个位置&#xff0c;这个位置可以保存不同类型的数据。同时&#xff0c;变量也被称作为类中的成员变量 在C#中声明变量时&#xff0c;你需要指定变量的类型&#xff0c;这告诉编译器你打算在变量中存储什么类型的…