ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

第7篇 rabbitmq 创建SocketFrameHandler

2021-06-07 22:02:23  阅读:187  来源: 互联网

标签:socket 创建 rabbitmq client SocketFrameHandler FrameHandler com impl


本节主要是熟悉socketFrameHandlerFactory类, 真正涉及到socket流处理器

  • 展示如下类图(我们本文关心是SocketFrameHandlerFactory 和SocketFrameHandler),由类图可以知道SocketFrameHandlerFactory继承抽象类AbstractFrameHandlerFactory, 抽象类实现FrameHandlerFactory接口
  • image-20210607174608720

1、FrameHandlerFactory (顶级接口)

  • 你可以看到它只有一个方法创建FrameHandler, 入参是地址和连接名称

    • FrameHandler create(Address addr, String connectionName) throws IOException;
      
  • 处理socket,必须创建socket对象,这就需要地址信息了,connectionName(连接名称)不是必要

1.1、Address地址对象

  • 它只有两个属性一个是_host 主机, _port 端口号
  • 主要方法就是解析ipv6(例如:[2001:db8:85a3:8d3:1319:8a2e:370:7348]:5671)的 host和port

1.2、FrameHandler (数据帧处理接口)

  • 它继承了NetworkConnection接口(主要地址相关的,获取本地地址和本地端口,以及地址和端口)
  • 实现类必须是线程安全的
  • com.rabbitmq.client.impl.FrameHandler#setTimeout ( 设置超时时间, 单位为毫秒)
  • com.rabbitmq.client.impl.FrameHandler#getTimeout (获取超时时间,单位为毫秒)
  • com.rabbitmq.client.impl.FrameHandler#sendHeader ( 设置请求头)
  • initialize() (初始化连接)
  • com.rabbitmq.client.impl.FrameHandler#readFrame (读取数据帧)
  • com.rabbitmq.client.impl.FrameHandler#writeFrame (写入数据帧)
  • com.rabbitmq.client.impl.FrameHandler#flush (刷新)
  • com.rabbitmq.client.impl.FrameHandler#close 关闭底层数据连接(没有实现Closeable接口)

2、AbstractFrameHandlerFactory 抽象类

  • 主要作用就是定义关于FrameHandlerFactory公共字段,其实很多地方也是这么用的,这个也是可以学习一下
  • 首先定义根据功能定义接口,第二步定义一个抽象类,把一个公共字段,还有可能模板方法写好,最后有子类进行实现
  • 能设置成final尽量设置成final
  • 成员变量
    • connectionTimeout 连接超时时间
    • configurator Socket 设置函数
    • ssl 是否ssl连接

3、SocketFrameHandlerFactory extend AbstractFrameHandlerFactory

3.1、成员变量

  • socketFactory socket工厂类
  • shutdownExecutor 关闭执行器
  • sslContextFactory ssl上下文工厂类

3.2、关键方法

  • com.rabbitmq.client.impl.SocketFrameHandlerFactory#create (创建处理器)

  • 流程如下所示

  • image-20210607192840575

  • 本质就是为创建socket对象,并将shutdownExecutor 封装成SocketFrameHandler对象,我们在3.3熟悉一下SocketFrameHandler

3.3、SocketFrameHandler implement FrameHandler

3.3.1、成员变量

  • _socket : socket对象

  • _shutdownExecutor 关闭执行器

  • _inputStream DataInputStream((BufferedInputStream))

    •         _inputStream = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
      
      
  • _outputStream DataOutputStream((BufferedOutputStream))

  • SOCKET_CLOSING_TIMEOUT=1指定强制关socket的逗留时间(单位为秒)

3.3.2、核心方法

  • com.rabbitmq.client.impl.SocketFrameHandler#sendHeader(设置请求头)

    • synchronized (_outputStream) {
                  _outputStream.write("AMQP".getBytes("US-ASCII"));
                  _outputStream.write(0);
                  _outputStream.write(major);
                  _outputStream.write(minor);
                  _outputStream.write(revision);
                  try {
                      _outputStream.flush();
                  } catch (SSLHandshakeException e) {
                      LOGGER.error("TLS connection failed: {}", e.getMessage());
                      throw e;
                  }
              }
      
    • 同步方法写入_outputStream,防止并发

    • AMQP采用是US-ASCII字符编码

    • 主要协商交互mq协议为 ( AMQP091)

  • com.rabbitmq.client.impl.SocketFrameHandler#initialize ( 开启监控socket 读取输入流)

    • 主要流程如下

    • image-20210607204159191

    • A、B、C、D 在下篇在串一下

  • com.rabbitmq.client.impl.SocketFrameHandler#close

    • 设置socket逗留时间为1秒
    • 使用shutdownExecutor执行 flush()方法(如果shutdownExecutor为空则手动调用flush方法, 异步Future task完成此项工作,防止写阻塞
    • 如果任务执行失败将考虑取消任务执行。
    • 最后再关闭socket

4、总结

  • 主要了解创建创建SocketFrameHandler类的过程,以及一些核心方法。类之间继承和实现
  • 一般会使用抽象接口定义公共属性和模板代码
  • 增加一个包装类,无非增加一些新能力和属性,数据形式转换

结尾

  • 感谢大家的耐心阅读,如有建议请私信或评论留言。
  • 如有收获,劳烦支持,关注、点赞、评论、收藏均可,博主会经常更新,与大家共同进步
  • 下一篇研究一下A,B,C,D具体处理逻辑

标签:socket,创建,rabbitmq,client,SocketFrameHandler,FrameHandler,com,impl
来源: https://blog.csdn.net/m0_37355951/article/details/117675351

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有