关闭连接
在应用程序使用完之后,需要关闭连接,释放资源:
channel.close();
conn.close() ;
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)
{
...
}
});
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();
...
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16