第6篇、rabbitmq客户端Connection接口(源码分析)

这篇主要了解一下Connection接口设计和思考

1、简单使用示例

  • ConnectionFactory factory = new ConnectionFactory();
    factory.setHost(hostName);
    factory.setPort(portNumber);
    factory.setVirtualHost(virtualHost);
    factory.setUserName(username);
    factory.setPassword(password);
    Connection conn = factory.newConnection();
    //创建一个通道
    Channel channel = conn.createChannel();
    
    
    //也可以直接使用uri, 客户端也是可以解析出来的
    ConnectionFactory factory = new ConnectionFactory();
    factory.setUri("amqp://username:password@hostName:portNumber/virtualHost");
    Connection conn = factory.newConnection();
    //创建一个通道
    Channel channel = conn.createChannel();
    
  • 当前的实现对于客户端API级别的代码是线程安全的,并且实际上除了RPC调用中的代码之外,内部是线程安全的。

2、Connection继承接口

2.1、ShutdownNotifier (关闭之后进行通知类)

  • 关闭操作之后需要进行对关心关闭操作监听器散布消息

####2.1.1、接口方法

  1. com.rabbitmq.client.ShutdownNotifier#addShutdownListener (添加监听器)

  2. com.rabbitmq.client.ShutdownNotifier#removeShutdownListener (移除监听器)

  3. com.rabbitmq.client.ShutdownNotifier#getCloseReason (获取关闭的原因)

  4. com.rabbitmq.client.ShutdownNotifier#notifyListeners(通知其他监听器)

  5. com.rabbitmq.client.ShutdownNotifier#isOpen (判断这个组件是否开启,有关闭异常说明已经关闭过返回false, 为空返回true)

####2.1.2、自定义关闭监听器(也是很简单)

  • /**
     * 自定义关闭监听器
     * @author liangchen
     * @date 2021/6/4
     */
    public class CustomerShutDownListener implements ShutdownListener {
        @Override
        public void shutdownCompleted(ShutdownSignalException cause) {
            //我们有可能在关闭时候释放一些其他资源什么
            //或者增加告警日志都是可以的
            System.out.println("CustomerShutDownListener:shutdownCompleted");
        }
    }
    
    
  • 然后connection.addShutdonwListener(new CustomerShutDownListener());

  • 详细参考github示例

2.2、Closeable接口

  • Closeable接口又继承AutoCloseable接口,我们来对比区别

  • 不同点CloseableAutoCloseable
    抛出异常IOExceptionException
    代码版本引入1.51.7
    是否保证幂等保证不保证(建议保证)

    为啥会出现AutoCloseable类呢?

    1. 关闭的资源不一定是IO文件流之类,原有Closeable抛出异常就限制它使用
    2. 为了使用try(需要关闭资源){}结构,简化去掉finally模块代码
    3. 为了兼容1.5 Closeable的类,只有将AutoCloseable作为父类,历史代码不需要修改。
    4. 只有实现close()方法,jvm关闭时候会自动调用close()方法
  • 参考implements-closeable-or-implements-autocloseable

3、Connection的方法

  1. com.rabbitmq.client.Connection#getAddress 获取地址
  2. com.rabbitmq.client.Connection#getPort 获取端口
  3. com.rabbitmq.client.Connection#getChannelMax 获取通道最大值,从1开始到这个数据,包含这个数字
  4. com.rabbitmq.client.Connection#getFrameMax 八字节表示,0表示无限制
  5. com.rabbitmq.client.Connection#getHeartbeat 心跳间隔,单位是秒,0表示没有限制
  6. com.rabbitmq.client.Connection#getClientProperties 获取客户端属性(包含版本之类)
  7. com.rabbitmq.client.Connection#getClientProvidedName 客户端连接名称,不是唯一的
  8. com.rabbitmq.client.Connection#getServerProperties 服务端属性(包含版本)
  9. com.rabbitmq.client.Connection#createChannel() 创建一个通道,返回null 通道不可用,一般用Optional判断null值情况
  10. com.rabbitmq.client.Connection#openChannel() 使用Optional包装一下createChannel()方法
  11. com.rabbitmq.client.Connection#close() 关闭方法(继承于Closeable接口)
  12. com.rabbitmq.client.Connection#abort() 意外中断方法
  13. com.rabbitmq.client.Connection#addBlockedListener 添加阻塞监听器
  14. com.rabbitmq.client.Connection#removeBlockedListener 移除阻塞监听器
  15. com.rabbitmq.client.Connection#clearBlockedListeners 清除阻塞监听器
  16. com.rabbitmq.client.Connection#getExceptionHandler 获取异常处理器
  17. com.rabbitmq.client.Connection#getId 唯一连接id,主要是指标收集器使用

3.1、总结

  1. 连接地址相关
  2. 心跳、客户端和服务端属性
  3. 创建通道
  4. 关闭和中断方法
  5. 阻塞监听器

4、总结

  1. 首先使用接口定义好功能,注意接口职责单一,方便扩展,这里就会很多重载方法
  2. 很多接口定义是为了扩展功能的,比如ShutdownListener来满足一些个性化需求。

结尾

  • 感谢大家的耐心阅读,如有建议请私信或评论留言。
  • 如有收获,劳烦支持,关注、点赞、评论、收藏均可,博主会经常更新,与大家共同进步
  • 下一篇就是翻译一篇比较好Optional使用经验
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值