RabbitMQ六种队列模式-简单队列模式

前言

RabbitMQ六种队列模式-简单队列 [本文]
RabbitMQ六种队列模式-工作队列
RabbitMQ六种队列模式-发布订阅
RabbitMQ六种队列模式-路由模式
RabbitMQ六种队列模式-主题模式

在官网的教程中,描述了如上六类工作队列模式:

  1. 简单队列模式:最简单的工作队列,其中一个消息生产者,一个消息消费者,一个队列。也称为点对点模式
  2. 工作模式:一个消息生产者,一个交换器,一个消息队列,多个消费者。同样也称为点对点模式
  3. 发布/订阅模式:无选择接收消息,一个消息生产者,一个交换器,多个消息队列,多个消费者。称为发布/订阅模式
  4. 路由模式:在发布/订阅模式的基础上,有选择的接收消息,也就是通过 routing 路由进行匹配条件是否满足接收消息。
  5. 主题模式:同样是在发布/订阅模式的基础上,根据主题匹配进行筛选是否接收消息,比第四类更灵活。
  6. RPC模式:与上面其他5种所不同之处,类模式是拥有请求/回复的。也就是有响应的,上面5种都没有。

接下来几篇文章一起来看看这几种队列模式吧,本篇为简单队列模式。

文章目录

文章目录

      • 前言
      • 文章目录
      • 1 实现功能
      • 2 构建项目
        • 2.1 导入依赖
        • 2.2 封装Connection
      • 3 生产者
      • 4 消费者
      • 5 测试环节
        • 5.1 启动RabbitMQ
        • 5.2 创建vhost
        • 5.3 依次运行Producer\Customer
      • 6 简单队列总结

1 实现功能

功能描述:一个生产者 P 发送消息到队列 Q,一个消费者 C 接收

P 表示为生产者 、C 表示为消费者,红色表示队列。

2 构建项目

创建一个简单的maven项目

  • rabbitmq 父工程
    – common 存放公用工具类
    – customer 消费者
    – producer生产者

2.1 导入依赖

在 rabbitmq 父工程 pom.xml 导入 maven 依赖

<dependencies><dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>3.6.5</version></dependency>
</dependencies>

2.2 封装Connection

common模块中封装 rabbitmq 连接类

public class MQConnectionUtils {public static Connection newConnection() throws IOException, TimeoutException {/** 1.定义连接工厂 */ConnectionFactory factory = new ConnectionFactory();/** 2.设置服务器地址 */factory.setHost("127.0.0.1");/** 3.设置协议端口号 */factory.setPort(5672);/** 4.设置vhost */factory.setVirtualHost("test001_host");/** 5.设置用户名称 */factory.setUsername("guest");/** 6.设置用户密码 */factory.setPassword("guest");/** 7.创建新的连接 */Connection newConnection = factory.newConnection();return newConnection;}}

3 生产者

生产者负责创建消息队列并发送消息入列,简单分为5步:

  1. 获取连接
  2. 创建通道
  3. 创建队列声明
  4. 发送消息
  5. 关闭队列
public class Producer {/** 队列名称 */private static final String QUEUE_NAME = "test_queue";public static void main(String[] args) throws IOException, TimeoutException {/** 1.获取连接 */Connection newConnection = MQConnectionUtils.newConnection();/** 2.创建通道 */Channel channel = newConnection.createChannel();/** 3.创建队列声明 */channel.queueDeclare(QUEUE_NAME, false, false, false, null);String msg = "我是生产者生成的消息";System.out.println("生产者发送消息:" + msg);/** 4.发送消息 */channel.basicPublish("", QUEUE_NAME, null, msg.getBytes());channel.close();newConnection.close();}
}

4 消费者

消费者实现和生产者实现过程差不多,但是没有关闭连接和通道,是因为要消费者一直等待随时可能发来的消息,大致分为如下3步:

  1. 获取连接
  2. 获取通道
  3. 监听队列
public class Customer {/** 队列名称 */private static final String QUEUE_NAME = "test_queue";public static void main(String[] args) throws IOException, TimeoutException {System.out.println("002");/** 1.获取连接 */Connection newConnection = MQConnectionUtils.newConnection();/** 2.获取通道 */Channel channel = newConnection.createChannel();channel.queueDeclare(QUEUE_NAME, false, false, false, null);DefaultConsumer defaultConsumer = new DefaultConsumer(channel) {@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body)throws IOException {String msgString = new String(body, "UTF-8");System.out.println("消费者获取消息:" + msgString);}};/** 3.监听队列 */channel.basicConsume(QUEUE_NAME, true, defaultConsumer);}}

5 测试环节

至此,整个项目代码写完了,接下来就是测试环节

5.1 启动RabbitMQ

5.2 创建vhost

5.3 依次运行Producer\Customer

Producer生产者启动

Rabbit管理平台,三条消息

Customer消费者启动

6 简单队列总结

简单队列也称为点对点,即一个生产者对应一个消费者,生产者发送消息到队列,消费者在队列中取出消息消费。

生产者大致步骤:

  1. 获取连接
  2. 创建通道
  3. 创建队列声明
  4. 发送消息
  5. 关闭队列

消费者大致步骤:

  1. 获取连接
  2. 获取通道
  3. 监听队列
  4. 消费消息

简单队列虽然简单,但是有一些不足,比如这种点对点无疑在复杂情况下会产生大量冗余代码,继续看下一篇工作队列吧。

案例代码:https://www.lanzous.com/i5ydu6d

我创建了一个java相关的公众号,用来记录自己的学习之路,感兴趣的小伙伴可以关注一下微信公众号哈:niceyoo

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

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

相关文章

工作290:重置新增的mode

/*4 GY定义 找到该组件下面的add方法*/add() {/* 5GY定义 给当前属性下面的title赋值*/this.title "新增";/*重置新增的mode*/this.mode[]this.show();this.IsShowtrue;this.attrthis.viewMode false;this.approveMode false/* 7GY定义 给当前的form赋值 并进行对…

串口数据字节位的理解

# STM32F4xx系列的MCU的UART数据字节组成如下图 # 发送数据做如下图示&#xff0c;data byte MSB 与 Parity 重合 # 先刨去 Parity bit&#xff0c;分析 LSB ~ MSB 的纯数据&#xff1a; > 假定数据中的 ‘1’ 个数为奇数&#xff0c;偶校验&#xff1a;Parity ‘1’&#…

RabbitMQ消息确认机制

文章目录1. 事务机制2. Confirm模式2.1 生产者2.1.1 普通Confirm模式2.1.2 批量Confirm模式2.1.3 异步Confirm模式2.2 消费者3. 其他消费者如何确保消息一定能够消费成功呢&#xff1f;由于在前面工作队列模式里面我们了解了应答模式&#xff0c;所以我们可以很自信的回答如上题…

工作292:数据绑定逻辑处理

},confirmAssociation() {if(this.selected!"") {putAction(this.url.put / this.task_id /bound, {content_id: this.selected}).then(res > {this.$message.success("绑定成功");this.$emit("ok")this.$refs["dialog"].close(…

工作293:调节删除顺序删除

}this.$confirm(您确定删除吗?, 提示, {confirmButtonText: 确定,cancelButtonText: 取消,type: warning}).then(res>{this.loadingtruedeleteAction(path.join(this.url.delete, record.id))/* this.list()*/this.reload()this.$message.success("删除成功");th…

RabbitMQ消息幂等性问题

文章目录1. 什么是幂等性&#xff1f;1.1 消息队列的幂等性1.2 模拟重试机制1.2.1 生产者代码1.2.2 消费者代码1.2.3 消费者 application.yml 配置2. 如何保证消息幂等性&#xff0c;不被重复消费&#xff1f;解决方法1. 什么是幂等性&#xff1f; 在编程中一个幂等操作的特点是…

JAVA面向对象明星类

public class _01Celebrity{//属性public String name;public int age;public double height;public char gender;//构造器public _01Celebrity(String name,int age,double height,char gender){this.name name;this.age age;this.height height;this.gender gender;}//方…

工作287:命名报错

return:{data:{account_id: ,BindData: [],RomoteData:[],dialogVisible: false,ff_account_index: ,form:{},}},这种命名报错

Centos安装JDK(java环境)

王小私下问我 centos 中 jdk 怎么安装呀&#xff0c;所以再次整理了这篇基础环境搭建的文章。 1、创建java目录2、下载上传jdk3、解压jdk4、配置环境变量 1、创建java目录 首先我们创建java的安装目录 cd /usrmkdir javacd java 2、下载上传jdk 我们如上在 usr 目录下创建了 ja…

iOS用workspace和cocoapods管理多个项目

工作空间下多工程共享cocoapods第三方库的方法 引自 https://www.jianshu.com/p/e3cfae830985转载于:https://www.cnblogs.com/-WML-/p/8946370.html

工作288:根据时间戳处理接口

<template><div class"table-list-page"><div class"query-area"><el-date-pickerv-model"value1"type"daterange"range-separator"至"start-placeholder"开始日期"end-placeholder"结…

Centos7安装MySQL(多图)

文章目录一、在线安装1、替换网易yum源2、清理缓存3、下载rpm文件4、安装MySQL数据库二、本地安装1、上传MySQL安装包2、安装依赖的程序包3、卸载mariadb程序包4、安装MySQL程序包5、修改MySQL目录权限6、初始化MySQL三、启动MySQL1.1、在线安装方式启动MySQL1.2、本地安装方式…

ROS与Arduino学习(六)Logging日志

ROS与Arduino学习&#xff08;六&#xff09;Logging日志 Tutorial Level:客户端与服务器 Next Tutorial&#xff1a;小案例节点通信 本节较为简单告诉大家如何向系统发布日志信息。 Tips 1 日志信息发布 节点提供了五种日志消息&#xff0c;分别是debug、information、warn、…

工作289:js取整

只保留整数部分&#xff08;丢弃小数部分&#xff09; parseInt(5.1234); // 5 向下取整&#xff08;< 该数值的最大整数&#xff0c;和parseInt()一样) Math.floor(5.1234); // 5 向上取整&#xff08;有小数&#xff0c;整数部分就1&#xff09; Math.ceil(5…

读书笔记8-浪潮之巅(part3)

浪潮之巅 ——风险投资 《浪潮之巅》的前半部分列举了在现代史上举足轻重的几家大型科技公司的历史&#xff0c;虽说成功的公司各有各的绝招&#xff0c;但是读多之后又略显重复、无聊&#xff08;这不是说原书的内容、描述是无聊的&#xff0c;相反其中的每一篇都值得多次欣赏…

工作290:js日期操作

Js获取当前日期时间及其它操作 var myDate new Date(); myDate.getYear(); //获取当前年份(2位) myDate.getFullYear(); //获取完整的年份(4位,1970-????) myDate.getMonth(); //获取当前月份(0-11,0代表1月) myDate.getDate(); //获取当前日(1-31…

lower_case_table_names=1 启动报错 mysql8.0

本文为采集文章&#xff0c;主博客地址&#xff1a;https://www.cnblogs.com/niceyoo 我们知道在 Linux 环境下默认是区分大小写的&#xff0c;所以我们需要改变这种默认方式&#xff0c;经过网上各种搜索后&#xff0c;基本就是清一色的修改 lower_case_table_names&#xff0…

微信小程序 weui 使用方法

https://github.com/Tencent/weui-wxss/ 下载地址用于小程序的https://github.com/Tencent/weui 下载地址用于H5 运用示例在下载文件的文件夹 weui-wxss-master\dist\example目录下小程序全局用法在app.wxss用import "weui.wxss"转载于:https://www.cnblogs.com/ch…

工作291:当前账号是否绑定操作

<template><el-dialogopen"open"title"绑定分发平台账号":visible.sync"dialogVisible"width"40%":before-close"handleClose"><el-form style"display: flex;justify-content: center;align-items: ce…

Redis之客户端连接方式

Reis的客户端连接方式有如下几种&#xff1a; 1.基本方式 /*** 简单基本方式调用*/Testpublic void test1JedisStandardClient() {Jedis jedis new Jedis("192.168.56.101", 6379);jedis.set("123", "first line is null");String valueString …