rabbitmq笔记-rabbitmq客户端开发使用

连接RabbitMQ

1.创建ConnectionFactory,给定参数ip地址,端口号,用户名和密码等

2.创建ConnectionFactory,使用uri方式实现,创建channel。

注意:

Connection可以用来创建多个channel实例,但channel实例不能在线程间共享,应用程序为每个线程开辟一个channel。多线程间共享channel实例是非线程安全的。

Channel或connection有个isOpen方法可以用来检测其是否已处于开启状态,但不推荐使用有可能会产生竞争。

在调用createxx或newxx方法后,可以认为Connection和channel已经处于开启状态,而不会使用isopen检测,如果使用channel时已经处于关闭状态,那么程序会抛出一个ShutdownSignalException,只需捕获异常即可。

使用交换器和队列

交换器和队列是amqp中high-level层面的构建模块,需确保在使用他们的时候就已经存在,在使用前需要声明他们

声明

java 复制代码
//创建一个持久化的,非自动删除的,绑定类型为direct的交换器
//创建一个非持久化,排他的,自动删除的队列
//使用路由键将队列和交换器绑定起来
channel.exchangeDeclare(exchangeName,"direct",true);
String queueName = channel.queueDeclare().getQueue();
channel.queueBind(queueName,exchangeName,routingKey);

何时创建

rabbitmq消息存储在队列中,交换器不真正耗费服务器的性能,队列会。实际业务中,需要对所创建的队列的流量、内存占用及网卡占用有一个清晰的认知,预估其平均值和峰值。

预先创建好资源可以确保交换器和队列之间正确绑定匹配。

发送消息

使用channel类的basicPublish方法

byte[] messageBodyBytes = "Hello,world".getBytes();

channel.basicPublish(exchangeName,routingKey,null,messageBodyBytes);

mandatory参数可以控制发送

消费消息

消费模式分为推模式和拉模式

推模式Basic.Consume

一般通过实现Consumer接口或继承DefaultConsumer类实现。当调用与Consumer相关的api方法时,不同的订阅采用不同的消费者标签来区分彼此,在同一个channel中的消费者也需要通过唯一的消费者标签作区分。

拉模式Basic.Get

通过channel.basicGet方法可以单条获取消息,返回值GetRespone。

消费端的确认与拒绝

消息确认

消费者订阅队列时,指定autoAck参数

  • autoAck==false:rabbitmq会等待消费者显式恢复确认信号才从内存中移去消息。
    • 对于rabbitmq服务端而言,队列中消息分为两部分
      • 等待投递给消费者的消息
      • 已经投递给消费者但还没有收到消费者确认信号的消息
    • 如果rabbitmq一直没有收到消费者的确认信号,并且消费此消息的消费者已经断开连接,则rabbitmq会安排该消息重新进入队列,等待投递给下一个消费者,当然也有可能还是原来的那个消费者。
    • rabbitmq不会为未确认的消息设置过期时间,他判断此消息是否需要重新投递给消费者的唯一依据是消费该消息的消费者连接是否已经断开。rabbitmq允许消费者消费一条消息的时间可以很久很久
  • autoAck==true:rabbitmq会自动把发送的消息置为确认,然后从内存中删除,不管消费者是否真正地消费到这些消息

消息拒绝

  • Basic.Reject:消费者客户端可以调用与其对应的channel.basicReject
  • Basic.Nack:reject命令一次只能拒绝一条消息,如果想批量拒绝,使用Basic.Nack
  • Basic.Reover:具备可重入队列特性,用来请求rabbitmq重新发送还未被确认的消息。
    • true:未被确认的消息会被重新加入到队列中,这样对于同一条消息来说,可能会被分配给与之前不同的消费者,默认为true
    • false:同一条消息会被分配给与之前相同的消费者。

关闭连接

channel.close();

conn.close();

Connection和Channel生命周期

  • open():开启状态,代表当前对象可以使用

  • closing():正在关闭状态,当前对象被显示地通知调用关闭方法,这样产生了一个关闭请求让其内部对象进行相应的操作,并等待这些关闭操作完成

  • closed():已经关闭状态,当前对象已经接收到所有的内部对象已完成关闭动作的通知,并且也关闭了自身。

  • getCloseReason:获取对象关闭原因

  • 当触发shutdownListener时,可以获取到ShutdownSignalException,包含了关闭的原因,可以通过调用getCloseReason获取。

    • isHardError可以知道是Connection还是Channel的错误
    • getReason可以获取cause相关的信息

参考:《RabbitMQ实战指南》

相关推荐
许苑向上几秒前
【零基础小白】 window环境下安装RabbitMQ
rabbitmq
幸运超级加倍~17 分钟前
软件设计师-上午题-16 算法(4-5分)
笔记·算法
王俊山IT37 分钟前
C++学习笔记----10、模块、头文件及各种主题(一)---- 模块(5)
开发语言·c++·笔记·学习
ZHOU西口1 小时前
微服务实战系列之玩转Docker(十八)
分布式·docker·云原生·架构·数据安全·etcd·rbac
zmd-zk1 小时前
kafka+zookeeper的搭建
大数据·分布式·zookeeper·中间件·kafka
Yawesh_best2 小时前
思源笔记轻松连接本地Ollama大语言模型,开启AI写作新体验!
笔记·语言模型·ai写作
CXDNW3 小时前
【网络面试篇】HTTP(2)(笔记)——http、https、http1.1、http2.0
网络·笔记·http·面试·https·http2.0
使者大牙3 小时前
【大语言模型学习笔记】第一篇:LLM大规模语言模型介绍
笔记·学习·语言模型
ssf-yasuo3 小时前
SPIRE: Semantic Prompt-Driven Image Restoration 论文阅读笔记
论文阅读·笔记·prompt
ajsbxi4 小时前
苍穹外卖学习记录
java·笔记·后端·学习·nginx·spring·servlet