ActiveMQ之 TCP通讯机制

  

  ActiveMQ支持多种通讯协议TCP/UDP等,我们选取最常用的TCP来分析ActiveMQ的通讯机制。首先我们来明确一个概念: 
  客户(Client):消息的生产者、消费者对ActiveMQ来说都叫作客户。 
  消息中介(Message broker)接收消息并进行相关处理后分发给消息的消费者.

  

    

  为了能清楚的描述出ActiveMQ的核心通讯机制,我们选择3个部分来进行说明,它们分别是建立链接、关闭链接、心跳

一、Client跟activeMQ的TCP通讯的初始化过程分析如下: 
  (1) ActiveMQ初始化时,通过TcpTransportServer类根据配置打开TCP侦听端口,客户端通过该端口发起建立链接的动作。 
  (2) 把接收到的socket放入阻塞队列。 
  (3) 另外一个线程Socket handler阻塞着,监听是否有新的socket,如果有则取出来。 
  (4) 生成一个TransportConnection的实例。TransportConnection类的主要作用是处理链路的状态信息,并实现CommandVisitor接口来完成各类消息的处理。 
  (5) TransportConnection会使用一个由多个TransportFilter实例组成的消息处理链条,负责对接收到的各类消息进行处理并发送相应的应答。这个链条的典型组成顺序: 

    MutexTransport->WireFormatNegotiator->InactivityMonitor->TcpTransport。在这条链条中最后的一环是TcpTransport类,它是实际和Client获取和发送数据的地方,该类的重要方法有run()和oneway(),一个负责读取,一个负责发送。 
  (6) 建链完成,可以进行通讯操作。 

二、关闭链接 
  ActiveMQ发现TCP链接的关闭,最关键的代码在TcpBufferedInputStream类中的

  int n = in.read(buffer, position, buffer.length - position);

三、心跳 
  为了更好的维护TCP链路的使用,ActiveMQ采用了心跳机制作为判断双方链路的健康情况。ActiveMQ使用的是双向心跳,也就是ActiveMQ的Broker和Client双方都进行相互心跳,但不管是Broker或Client心跳的具体处理情况是完全一样的,都在InactivityMonitor类中实现,下面具体介绍。 
  心跳会产生两个线程“InactivityMonitor ReadCheck”和“InactivityMonitor WriteCheck”,它们都是Timer类型,都会隔一段固定时间被调用一次。ReadCheck线程主要调用的方法是readCheck(),当在等待时间内,有消息接收到,则该方法会返回true。WriteCheck线程主要调用的方法是writeCheck()。

  这有个小技巧,大家可以参考一下,那就是当WriteCheck线程休眠时,有任何数据发送成功,则该线程被唤醒后,不用通过TCP向对方真的发送心跳消息,这样可以从一定程度上减少网络传输的数据量。

时间: 2024-08-07 08:51:50

ActiveMQ之 TCP通讯机制的相关文章

C#中的TCP通讯与UDP通讯

最近做了一个项目,主要是给Unity3D和实时数据库做通讯接口.虽然方案一直在变:从开始的UDP通讯变为TCP通讯,然后再变化为UDP通讯;然后通讯的对象又发生改变,由与数据库的驱动进行通讯(主动推送数据给驱动,数据库中数据发生变化把数据以UDP报文形式发送客户端)改为与实时数据库进行直接通讯(自己发送报文修改数据库中的数据,自己请求需要获取的数据并接收自己请求的数据):现在这个项目基本完结,由于这个过程既接触到了UDP又接触到了TCP,现在对其进行一番总结. 阅读目录 TCP通讯协议与UDP通

'IOKING' TCP Transmission Server Engine ('云猴'©TCP通讯server引擎)(预告版)

关键词: IOKING IOCP TCP  Transmission Server Engine Lock Free Interlocked 云猴完毕portTCP通讯server引擎 无锁 原子锁(函数) 'IOKING' TCP Transmission Server Engine ('云猴'?TCP通讯server引擎)(预告版) 下载连接: http://download.csdn.net/detail/guestcode/7474171 补充: 无锁消息引擎已经完毕: http://b

GCDAsyncSocket类库,IOS下TCP通讯使用心得

关于在IOS下使用Socket进行通讯的技术文章也许诺很久了,今日又是一个还债的日子,网上虽然很多介绍过AsyncSocket或GCDAsyncSocket的文章,但其实就那么一两篇大部分都是转载,于是我义正言辞.慷慨激昂的批判他们这种不负责任的态度,学习,不是给自己学的,是要和大家分享的.技术的共享有利于整体行业的进步,也可以使自身更深入全面的了解. 之前的文章中我们讲到过TCP通讯协议,并且也对其进行了较为详细的介绍和描述,关于TCP通讯的原理此处我们不再赘述,如有需要的看官可自行翻阅本人所

QTcpSocket-Qt使用Tcp通讯实现服务端和客户端

版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:QTcpSocket-Qt使用Tcp通讯实现服务端和客户端     本文地址:http://techieliang.com/2017/12/530/ 文章目录 1. 基本功能  1.1. pro文件配置  1.2. QTcpServer服务端建立  1.3. 客户端建立  1.4. 消息收发 2. 其他  2.1. 实现单服务器多客户端通讯  2.2. 关于QTcpServer  2.3.

异常和TCP通讯

第七章 异常处理 * 异常处理机制中的try-catch * 语法: * try{ * 代码片段 * }catch(XXXException e){ * 当try中的代码片段出现了XXXException后的处理代码 * } * try中的代码片段报错行以下的代码都不会运行* 应当有一个好习惯,在最后一个catch处捕获Exception* 这样能避免因为一个未捕获的异常导致程序中断 * finally * finally块是异常处理机制的最后一块,只能跟在最后一个catch之后或直接跟在try

C# Socket的TCP通讯

Socket的TCP通讯 一. socket的通讯原理 服务器端的步骤如下. (1)建立服务器端的Socket,开始侦听整个网络中的连接请求. (2)当检测到来自客户端的连接请求时,向客户端发送收到连接请求的信息,并建立与客户端之间的连接. (3)当完成通信后,服务器关闭与客户端的Socket连接. 客户端的步骤如下. (1)建立客户端的Socket,确定要连接的服务器的主机名和端口. (2)发送连接请求到服务器,并等待服务器的回馈信息. (3)连接成功后,与服务器进行数据的交互. (4)数据处

[Modbus] 如何看懂 Modbus TCP 通讯协定

最近笔者接了一个工控系统,其中PLC所使用的是Modbus TCP的通讯协定. 由于这个部分因为从来没有接触过,所以花了一点时间研究. 趁著现在记忆犹新,赶紧写下来,方便日后对照,也让读者们能够快速看懂Modbus TCP协定. Modbus为工业上常用的通讯协定之一,也是目前工业领域通讯协定常用的标准协定. 一般来说,Modbus主要可以再细分为两种协定(Modbus?RTU?.Modbus ASCII .Modbus TCP) Modbus?RTU?是一种为使用二进制表示法来进行数据的传递与

一.SuperIO通讯机制

1.1    应用场景 通讯平台的交互对象包括两方面:第一.与硬件产品交互.第二.与软件产品交互.基本这两方面考虑,通讯平台一般会应用在两个场景: 1)通讯平台应用在PC机上 主要应用在自动站的工控机上,通过RS485/RS232.RJ45.4-20mA等方式采集硬件设备的数据信息.同时,通讯平台与服务器端的软件进行交互,负责上传数据信息,以及接收控制命令等. 2)通讯平台应用在服务器端上 终端设备以3G/4G.有线专网.卫星等与通讯平台连接,进行数据交互,终端设备包括:PC机.移动终端(手机)

推荐一款开源的C#TCP通讯框架

原来收费的TCP通讯框架开源了,这是一款国外的开源TCP通信框架,使用了一段时间,感觉不错,介绍给大家 框架名称是networkcomms 作者开发了5年多,目前已经停止开发,对于中小型的应用场景,够用了. 框架的地址是: https://github.com/MarcFletcher/NetworkComms.Net 界面如下: 点那个Download就可以下载源码了 下载之后,解压缩之后的文件列表如下: 可以用VS打开NetworkCommsDotNet工程文件了 用 vs2010打开,可能