这篇主要了解一下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、接口方法
-
com.rabbitmq.client.ShutdownNotifier#addShutdownListener (添加监听器)
-
com.rabbitmq.client.ShutdownNotifier#removeShutdownListener (移除监听器)
-
com.rabbitmq.client.ShutdownNotifier#getCloseReason (获取关闭的原因)
-
com.rabbitmq.client.ShutdownNotifier#notifyListeners(通知其他监听器)
-
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接口,我们来对比区别
-
不同点 Closeable AutoCloseable 抛出异常 IOException Exception 代码版本引入 1.5 1.7 是否保证幂等 保证 不保证(建议保证) 为啥会出现AutoCloseable类呢?
- 关闭的资源不一定是IO文件流之类,原有Closeable抛出异常就限制它使用
- 为了使用try(需要关闭资源){}结构,简化去掉finally模块代码
- 为了兼容1.5 Closeable的类,只有将AutoCloseable作为父类,历史代码不需要修改。
- 只有实现close()方法,jvm关闭时候会自动调用close()方法
3、Connection的方法
- com.rabbitmq.client.Connection#getAddress 获取地址
- com.rabbitmq.client.Connection#getPort 获取端口
- com.rabbitmq.client.Connection#getChannelMax 获取通道最大值,从1开始到这个数据,包含这个数字
- com.rabbitmq.client.Connection#getFrameMax 八字节表示,0表示无限制
- com.rabbitmq.client.Connection#getHeartbeat 心跳间隔,单位是秒,0表示没有限制
- com.rabbitmq.client.Connection#getClientProperties 获取客户端属性(包含版本之类)
- com.rabbitmq.client.Connection#getClientProvidedName 客户端连接名称,不是唯一的
- com.rabbitmq.client.Connection#getServerProperties 服务端属性(包含版本)
- com.rabbitmq.client.Connection#createChannel() 创建一个通道,返回null 通道不可用,一般用Optional判断null值情况
- com.rabbitmq.client.Connection#openChannel() 使用Optional包装一下createChannel()方法
- com.rabbitmq.client.Connection#close() 关闭方法(继承于Closeable接口)
- com.rabbitmq.client.Connection#abort() 意外中断方法
- com.rabbitmq.client.Connection#addBlockedListener 添加阻塞监听器
- com.rabbitmq.client.Connection#removeBlockedListener 移除阻塞监听器
- com.rabbitmq.client.Connection#clearBlockedListeners 清除阻塞监听器
- com.rabbitmq.client.Connection#getExceptionHandler 获取异常处理器
- com.rabbitmq.client.Connection#getId 唯一连接id,主要是指标收集器使用
3.1、总结
- 连接地址相关
- 心跳、客户端和服务端属性
- 创建通道
- 关闭和中断方法
- 阻塞监听器
4、总结
- 首先使用接口定义好功能,注意接口职责单一,方便扩展,这里就会很多重载方法
- 很多接口定义是为了扩展功能的,比如ShutdownListener来满足一些个性化需求。
结尾
- 感谢大家的耐心阅读,如有建议请私信或评论留言。
- 如有收获,劳烦支持,关注、点赞、评论、收藏均可,博主会经常更新,与大家共同进步
- 下一篇就是翻译一篇比较好Optional使用经验