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);
原文地址:https://www.cnblogs.com/no-celery/p/14014891.html