zoukankan      html  css  js  c++  java
  • 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);
  • 相关阅读:
    lua判断字符串包含另一个字符串
    expect使用技巧
    Linux expect
    expect正则捕获返回结果
    修改alpine Linux的Docker容器的时区
    Dockerfile镜像优化,减小镜像
    Sed在匹配行前后加入一行
    scp的使用以及cp的对比
    rsync 的用法
    傅里叶系列(一)傅里叶级数的推导 (转)
  • 原文地址:https://www.cnblogs.com/no-celery/p/14014891.html
Copyright © 2011-2022 走看看