RabbitMQ知识点整理13-关闭连接
在应用程序使用完之后,需要关闭连接,释放资源:
channel.close();
connection.close();
显式地关闭Channel 是个好习惯,但这不是必须的,在Connection关闭的时候,Channel 也会自动关闭。
AMQP 协议中的Connection 和Channel 采用同样的方式来管理网络失败、内部错误和显式地关闭连接。Connection 和Channel 所具备的生命周期如下所述。
Open : 开启状态,代表当前对象可以使用。
Closing : 正在关闭状态。当前对象被显式地通知调用关闭方法( shutdown) ,这样就产生了一个关闭请求让其内部对象进行相应的操作, 并等待这些关闭操作的完成。
Closed : 已经关闭状态。当前对象己经接收到所有的内部对象己完成关闭动作的通知,并且其也关闭了自身。
Connection 和Channel 最终都是会成为Closed 的状态,不论是程序正常调用的关闭方法,或者是客户端的异常,再或者是发生了网络异常。
在Connection 和Channel 中,与关闭相关的方法有addShutdownListener(ShutdownListener listener) 和removeShutdownListener (ShutdownListnerlistener) 。当Connection 或者Channel的状态转变为Closed 的时候会调用ShutdownListener 。而且如果将一个ShutdownListener 注册到一个己经处于Closed状态的对象(这里特指Connection 和Channel 对象)时,会立刻调用ShutdownListener 。
getCloseReason 方法可以让你知道对象关闭的原因; isOpen 方法检测对象当前是否处于开启状态; close(int closeCode , String closeMessage ) 方法显式地通知当前对象执行关闭操作。
当触发ShutdownListener 的时候,就可以获取到ShutdownSignalException ,这个ShutdownSignalException 包含了关闭的原因,这里原因也可以通过调用前面所提及的getCloseReason 方法获取。
ShutdownSignalException 提供了多个方法来分析关闭的原因。isHardError 方法可以知道是Co 且口ectio丑的还是Channel 的错误; getReason 方法可以获取cause 相关的信息
public void shutdownCompleted(ShutdownSignalException cause) { String hardError = ""; String applInit = ""; if (cause.isHardError()) { hardError = "connection"; } else { hardError = "channel"; } if (cause.isInitiatedByApplication()) { applInit = "application"; } else { applInit = "broker"; } logger.warn("Connectivity to MQ has failed. It was caused by " + applInit + " at the " + hardError + " level. Reason received " + cause.getReason()); } }
如上面的代码, 当连接connection被关闭时,这个连接connection上打开的所有通道channel都会一并被关闭,这个时候就会触发注册在这个connection和所有channel上的ShutdownListener监听器,如果只是某个channel被关闭,则仅仅会触发该channel上的ShutdownListener监听器。ShutdownSignalException异常包含了关闭的异常信息,通过调用cause.getReason()获取异常出现的原因等信息。
connection.addShutdownListener(new ShutdownListener() {
public void (ShutdownSignalException cause) {
......
}
});
// channel 添加监听器
channel.addShutdownListener(new ShutdownListener() {
public void (ShutdownSignalException cause) {
......
}
});
// 移除监听器
connection.removeShutdownListener(listener);
channel.removeShutdownListener(listener);