Ezreal 书架 Ezreal 书架
Home
  • 《Go程序员面试笔试宝典》
  • 《RabbitMQ 实战指南》
  • 《深入理解kafka》
  • MySQL45讲
  • 透视HTTP协议
  • 结构化数据的分布式存储系统
  • Raft 共识算法
Home
  • 《Go程序员面试笔试宝典》
  • 《RabbitMQ 实战指南》
  • 《深入理解kafka》
  • MySQL45讲
  • 透视HTTP协议
  • 结构化数据的分布式存储系统
  • Raft 共识算法
  • RabbitMQ简介

  • RabbitMQ 入门

  • 客户端开发向导

    • 连接 RabbitMQ
    • 使用交换器和队列
    • 发送消息
    • 消费消息
    • 消费端的确认与拒绝
    • 关闭连接
    • 小结
  • RabbitMQ 进阶

  • RabbitMQ 管理

  • RabbitMQ实战指南
  • 客户端开发向导
ezreal_rao
2023-04-04

关闭连接

在应用程序使用完之后,需要关闭连接,释放资源:

channel.close(); 
conn.close() ;
1
2

显式地关闭 Channel 是个好习惯,但这不是必须的,在 Connection 关闭的时候,Channel 也会自动关闭。

AMQP 协议中的 Connection 和 Channel 采用同样的方式来管理网络失败、内部错误和显式地关闭连接。 Connection 和 Channel 所具备的生命周期如下所述。

  • Open: 开启状态,代表当前对象可以使用。
  • Closing: 正在关闭状态。当前对象被显式地通知调用关闭方法 (shutdown) ,这样 就产生了一个关闭请求让其内部对象进行相应的操作,并等待这些关闭操作的完成。
  • Closed: 已经关闭状态。当前对象己经接收到所有的内部对象己完成关闭动作的通知,并且其也关闭了自身。

Connection 和 Channel 最终都是会成为 Closed 的状态,不论是程序正常调用的关闭方法,或者是客户端的异常,再或者是发生了网络异常。

在 Connection 和 Channel 中,与关闭相关的方法有 addShutdownListener (ShutdownListener listener) 和 removeShutdownListener (ShutdownListner listener)。当 Connection 或者 Channel 的状态转变为 Closed 的时候会调用 ShutdownListener。而且如果将一个 ShutdownListener 注册到一个己经处于 Closed 状态的对象 (这里特指 Connection 和 Channel 对象) 时,会立刻调用 ShutdownListener。

getCloseReason 方法可以让你知道对象关闭的原因;isOpen 方法检测对象当前是否处于开启状态;close (int closeCode, String closeMessage) 方法显式地通知当前对象执行关闭操作。

有关 ShutdownListener 的使用可以参考代码清单 3-11 。

代码清单 3-11

import com.rabbitmq.client.ShutdownSignalException; 
import com.rabbitmq.client.ShutdownListener;

connection.addShutdownListener(new ShutdownListener() {
    public void shutdownCompleted (ShutdownSignalException cause)
    {
        ...
    }
});
1
2
3
4
5
6
7
8
9

当触发 ShutdownListener 的时候,就可以获取到 ShutdownSignalException,这个 ShutdownSignalException 包含了关闭的原因 ,这里原因 也可以通过调用前面所提及的 getCloseReason 方法获取。

ShutdownSignalException 提供了多个方法来分析关闭的原因。isHardError 方法可以知道是 Connection 的还是 Channel 的错误;getReason 方法可以获取 cause 相关的信息,相关示例可以参考代码清单 3- 12。

代码清单 3-12

public void shutdownCompleted(ShutdownSignalException cause)
{
    if (cause.isHardError())
    {
        Connection conn = (Connection)cause.getReference();
        if (!cause . isInitiatedByApplication())
        {
            Method reason = cause.getReason();
            ...
        }
        ...
    } else  {
        Channel ch = (Channel)cause.getReference();
        ...
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#mq#rabbitmq#amq
上次更新: 5/9/2023, 10:58:32 AM
消费端的确认与拒绝
小结

← 消费端的确认与拒绝 小结→

最近更新
01
为什么我的MySQL会抖一下
07-15
02
HTTP 性能优化面面观
07-12
03
WebSocket:沙盒里的 TCP
07-12
更多文章>
Theme by Vdoing | Copyright © 2022-2024 Ezreal Rao | CC BY-NC-SA 4.0
豫ICP备2023001810号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式