【RabbitMQ 三】Java客户端开发

本文引用的代码源自《RabbitMQ实战指南》

关键的类和接口主要有Channel、Connection、ConnectionFactory、Consumer等,它们主要的作用如下:

  • Channel:实现AMQP协议层的操作
  • Connection:开启信道(Channel)、注册事件处理器、关闭连接

与RabbitMQ相关的开发工作,也主要围绕Channel、Connection这两个类展开

1.连接RabbitMQ:创建Connection

知道了RabbitMQ的IP地址、端口号、用户名、密码后,可以通过以下代码连接RabbitMQ,

在这里插入图片描述

2.创建信道

在创建完Connection以后,就建立了当前服务与RabbitMQ的连接。下一步就是使用Connection对象建立信道

Channel channel = conn.createChannel()

创建完Channel之后,可以使用Channel对象来发送、接收消息

注意:一个Connection可以创建多个Channel对象,但是Channel对象不是线程安全的。也就是说,最好为每个线程创建一个Channel

一般来说,调用connectionFactory.newConnection()或者connection.createChannel()以后,Connection和Channel就处于开启状态了。如果在后续使用channel的过程中,Connection或者Channel关闭了,程序会抛出异常

3.声明交换器、绑定队列

在绑定交换器和队列前,要确保先声明交换器和队列,即前两行所示

在这里插入图片描述

  • channel.exchangeDeclare是声明一个交换器。这里传入参数的意思是:声明一个名为exchangeName的交换器,交换器类型为direct,并且这是一个可持久化的交换器(第三个入参=true)。可持久化的意思是交换器信息会存入2磁盘,服务器重启后不会丢失交换器的信息

  • channel.queueDeclare是声明一个队列,不带任何入参是声明一个由RabbitMQ命名的、非持久化队列

  • channel.queueBind是绑定交换器和队列

既然交换器和队列存在绑定操作,也就必然存在解绑操作,可以通过queueUnbind方法来解绑

4.创建队列的时机

虽然RabbitMQ使用交换器和队列来处理消息,但因为消息只存储在队列中,所以交换器实际不消耗服务器资源,只有队列会消耗服务器资源

换句话说,是否在代码里创建队列也可以见仁见智:

  1. 动态创建:如果服务器资源充足,那么RabbitMQ官方建议生产者和消费者都应该显式建立队列。这样做可以确保交换器和队列是正确绑定匹配的(避免发送消息的交换器没有绑定任何队列、或者发送消息的路由键匹配不上队列,导致消息丢失)
  2. 静态创建:如果业务已经充分确定了队列长度,可以在上线前在服务器上以RabbitMQ命令创建好队列,这样业务层就不用再声明队列了

5.发送消息

发送消息可以使用channel.basicPulish方法,例如:

在这里插入图片描述

以上代码意思是:

  1. 将消息发送到exchangeName交换器汇总
  2. 交换器根据routingKey将消息存储到RabbitMQ的相应队列中
  3. 消息内容是messageBodyBytes

除了byte数组,还可以使用channel.basicPulish的重载方法,发送具有特殊格式的消息

6.消费消息

RabbitMQ有两种消费消息的方式:push(推)、pull(拉)

6.1 Push

Push模式下,消费者持续订阅队列,一般要实现Consumer接口或继承DefaultConsumer类

消费动作是调用channel.basicConsume来实现

在这里插入图片描述

以上调用channel.basicConsume的意思是:

  1. 从queueName队列中订阅消息
  2. autoAck=true时,消费者需要在接收到消息后显式地进行ack操作(调用channel.basicAck
  3. 当前消费者从队列中订阅消息的同时,也可能有其他消费者订阅相同的队列,使用consumerTag来区分多个消费者
  4. 最后一个入参,传入了一个DefaultConsumer的匿名实现类,这其实是消费者的回调方法。当消费者收到订阅队列的消息时,会执行重写的handleDelivery方法

6.2 Pull

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

k8s集群统一设置时间

1 安装时间同步需要软件 yum install -y ntpdate2 设置时间 2.1 手动设置时间 date -s "20190712 18:30:50" hwclock --systohc2.2 在线更新时间 ntpdate 0.asia.pool.ntp.org # 强制把系统时间写入CMOS clock -w3 强制把系统时间写入CMOS hwclock作用与clock相…

【复杂网络】如何用简易通俗的方式快速理解什么是“相对重要节点挖掘”?

什么是相对重要节点? 一、相对重要节点的定义二、如何区分相对重要节点与重要节点?1. 相对重要性与节点相似性2. 识别相对重要节点的两个阶段第一阶段:个体重要性值的计算第二阶段:累积重要性值的计算 三、经典的相对重要节点挖掘…

08 - 条件判断语句

---- 整理自狄泰软件唐佐林老师课程 文章目录 1. 条件判断语句2. 语法说明3. 经验4. 代码 1. 条件判断语句 makefile 中支持条件判断语句 可以根据条件的值来决定 make 的执行可以比较两个不同变量或者变量和常量的值 注:条件判断语句只能用于控制 make 实际执行的…

探索大模型能力--prompt工程

1 prompt工程是什么 1.1 什么是Prompt? LLM大语言模型终究也只是一个工具,我们不可能每个人都去训一个大模型,但是我们可以思考如何利用好大模型,让他提升我们的工作效率。就像计算器工具一样,要你算10的10倍&#x…

今天看到一个有意思的问题:个人网站被恶意大量访问,怎么办(文末附GPT指令优化)

目录 问题描述 一、GPT 3.5 二、通义千问 三、讯飞星火 四、文心一言 五、Kimi 六、智谱清言 个人分析: 问题描述 大家好!我的个人网站每天晚上7点30到11点被固定的十几个IP大量下载exe,造成网站带宽不够,怎么办! 已经把…

大模型系列之解读MoE

Mixtral 8x7B 的推出, 使我们开始更多地关注 基于MoE 的大模型架构, 那么,什么是MoE呢? 1. MoE溯源 MoE的概念起源于 1991 年的论文 Adaptive Mixture of Local Experts(https://www.cs.toronto.edu/~hinton/absps/jjn…

如何在Android设备上恢复丢失的照片

Android手机或平板电脑上的照片丢失了?不要惊慌,您也许可以恢复它们。 由于我们的大量数据和日常生活都存储在一台设备上,有时将所有照片存储在本地的 Android 智能手机或平板电脑上可能是一项冒险的工作。无论是通过事故(损坏、…

python数据分析常用基础语法

Python语言基础——语法基础 前言一、变量的介绍与使用变量的介绍变量命名规则变量的使用拓展 二、标识符标识符命名命名规则注意事项 三、数据类型数据类型的介绍数据类型的查看示例 四、输入与输出输入和输出的介绍format格式化输出占位符 五、代码缩进与注释代码缩进 前言 …

最高20K/月,安全、数通、云计算多个方向急招,可内推!

高级安全工程师【岗位职责及要求】 1、统筹负责行业客户的安全项目交付,能够独自输出技术方案并完成施,并具备指导初中级工程师实施的能力; 2、掌握H3C全系列安全产品功能并对全系列产品原理有深入了解,能够熟练完成安全产品规划及…

如何找到台式电脑的ip地址

在数字时代,每台接入网络的设备都拥有一个独特的标识,这就是IP地址。无论是手机、笔记本电脑还是台式电脑,IP地址都扮演着至关重要的角色,它帮助设备在网络世界中定位并与其他设备进行通信。对于许多电脑用户来说,了解…

RK3576芯片规格,以及与RK3588对比

瑞芯微RK3576是一款高性能、低功耗的SoC(系统级芯片)处理器,适用于基于ARM的PC、边缘计算设备、个人移动互联网设备等多种应用场景。它采用Arm架构的八核心CPU,集成了GPU、MCU、NPU、VPU等多种计算核心,并具有丰富的外…

Python面向对象编程思想的深入学习

魔术方法的使用 案例体验 class Student:def __init__(self, name, age):self.name nameself.age age# __str__魔术方法, 如果不去写这个方法,那么print输出的则是信息存储的内存地址。def __str__(self):return fStudent类对象,name:{self.name}, ag…

SolidWorks进行热力学有限元分析一、模型建立

1.话不多说按照我的操作来 2.这一步鼠标移到中心点直接拉就行 3.这里选单位,继续按照操作来 4.选中这个边,直接拉,输入尺寸后确定,其他边同理 5.鼠标右键设置厚度 6.右键零件,然后编辑材料,给他赋予你需要的…

RapidJSON介绍

1.简介 RapidJSON 是一个 C 的 JSON 解析库,由腾讯开源。 支持 SAX 和 DOM 风格的 API,并且可以解析、生成和查询 JSON 数据。RapidJSON 快。它的性能可与strlen() 相比。可支持 SSE2/SSE4.2 加速。RapidJSON 独立。它不依赖于 BOOST 等外部库。它甚至…

ubuntu20安装colmap

系统环境 ubuntu20 ,cuda11.8 ,也安装了anaconda。因为根据colmap的官方文档说的,如果根据apt-get安装的话,默认是非cuda版本的,而我觉得既然都安装了cuda11.8了,自然也要安装cuda版本的colmap。 安装步骤…

力扣hot100:543. 二叉树的直径/108. 将有序数组转换为二叉搜索树

一、543. 二叉树的直径 LeetCode:543. 二叉树的直径 二叉树的直径 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。 遇到二叉树的问题很容易去直接用求解的目标去定义递归函数。但是仔细考虑,返回树的直径并不能向上传播。因此我们可以拆…

Git同步代码

Git中5个区,和具体操作? 代码提交和同步代码 代码撤销和撤销同步 平时是怎么提交代码的? 第零步: 工作区与仓库保持一致第一步: 文件增删改,变为已修改状态第二步: git add ,变为已暂存状态 $ git status $ git a…

HCIP的学习(OSPF总篇)

HCIA的复习 这边可以与我之前写的HCIA博客结合起来一起看,效果更好 HCIA的学习(6) OSPF状态机 down—关闭-----一旦启动OSPF进程,并发出hello报文,则进入下一个状态init----初始化状态------当收到的hello报文中存在…

临时邮箱API发送邮件的安全性?如何保障?

临时邮箱API发送邮件的步骤有哪些?设置邮箱API方法? 电子邮件作为一种重要的通信方式,而临时邮箱API作为一种新兴的邮件发送技术,其安全性更是成为大家关注的焦点。那么,临时邮箱API发送邮件的安全性究竟如何呢&#…

leetcode-括号生成-101

题目要求 思路 1.左括号的数量等于右括号的数量等于n作为判出条件,将结果存到res中 2.递归有两种,一种是增加左括号,一种是增加右括号,只要左括号的数量不超过n,就走增加左括号的递归,右括号的数量只要小于…