`
netcomm
  • 浏览: 142564 次
  • 来自: ...
文章分类
社区版块
存档分类
最新评论

消息中间件 activeMQ的源码分析 之 TCP通讯机制

阅读更多

  
    activeMQ支持多种通讯协议TCP/UDP等,我们选取最常用的TCP来分析activeMQ的通讯机制。首先我们来明确一个概念:
客户(Client):消息的生产者、消费者对activeMQ来说都叫作客户。
消息中转器(Message broker):它是activeMQ的核心,它接收信息并进行相关处理后分发给消息消费者。
    为了能清楚的描述出activeMQ的核心通讯机制,我们选择3个部分来进行说明,它们分别是建立链接、关闭链接、心跳。
一、Client跟activeMQ的TCP通讯的初始化过程分析如下:
1. activeMQ初始化时,通过TcpTransportServer类根据配置打开TCP侦听端口,客户通过该端口发起建立链接的动作。
2. 把accept的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向对方真的发送心跳消息,这样可以从一定程度上减少网络传输的数据量。
    activeMQ的通讯处理机制还有很多,如断开重连等等,非常希望大家可以有兴趣来一起补充。
后文待续。

 

  • 大小: 47.5 KB
分享到:
评论
4 楼 DEMONU 2015-06-08  
这个双向重连有什么好处和弊端了?感觉没必要啊
3 楼 wxq276 2009-11-16  
ActiveMQ的UDP协议怎么用的呀,这两天试了一下,接收时出现警告:
2009-11-16 16:07:33 org.apache.activemq.transport.udp.CommandDatagramChannel sendBuffer
警告: Request for buffer: 6 is no longer present
2009-11-16 16:07:33 org.apache.activemq.transport.udp.CommandDatagramChannel sendBuffer
警告: Request for buffer: 7 is no longer present
2009-11-16 16:07:33 org.apache.activemq.transport.udp.CommandDatagramChannel sendBuffer
警告: Request for buffer: 8 is no longer present
2009-11-16 16:07:33 org.apache.activemq.transport.udp.CommandDatagramChannel sendBuffer
警告: Request for buffer: 9 is no longer present
2009-11-16 16:07:33 org.apache.activemq.transport.udp.CommandDatagramChannel sendBuffer
警告: Request for buffer: 10 is no longer present
2009-11-16 16:07:33 org.apache.activemq.transport.udp.CommandDatagramChannel sendBuffer
警告: Request for buffer: 11 is no longer present
2009-11-16 16:07:33 org.apache.activemq.transport.udp.CommandDatagramChannel sendBuffer
警告: Request for buffer: 12 is no longer present
2009-11-16 16:07:33 org.apache.activemq.transport.udp.CommandDatagramChannel sendBuffer
警告: Request for buffer: 13 is no longer present
2009-11-16 16:07:33 org.apache.activemq.transport.udp.CommandDatagramChannel sendBuffer
警告: Request for buffer: 6 is no longer present
2009-11-16 16:07:33 org.apache.activemq.transport.udp.CommandDatagramChannel sendBuffer
警告: Request for buffer: 7 is no longer present
2009-11-16 16:07:33 org.apache.activemq.transport.udp.CommandDatagramChannel sendBuffer
警告: Request for buffer: 8 is no longer present
2009-11-16 16:07:33 org.apache.activemq.transport.udp.CommandDatagramChannel sendBuffer
警告: Request for buffer: 9 is no longer present
2009-11-16 16:07:33 org.apache.activemq.transport.udp.CommandDatagramChannel sendBuffer
警告: Request for buffer: 10 is no longer present
2009-11-16 16:07:33 org.apache.activemq.transport.udp.CommandDatagramChannel sendBuffer
警告: Request for buffer: 11 is no longer present
2 楼 boxer1003 2009-07-13  
我只能通过“顶”来支持楼主了,一直想找这方面的资料,谢谢lz大牛的辛勤劳动
1 楼 coofucoo 2009-07-13  
非常不错!

相关推荐

    activemq 5.5 源码

    10. **性能优化**:源码分析可以帮助我们理解ActiveMQ是如何进行性能优化的,例如批量发送、消息压缩、网络优化等。 深入研究ActiveMQ 5.5.0的源码,不仅可以帮助开发者理解消息中间件的基本工作原理,还能为开发...

    activeMQ5.8源码

    10. **性能优化**:源码分析可以深入到ActiveMQ的内部优化,如消息批量发送、零拷贝技术、内存管理等,这些都是提升消息中间件性能的关键。 通过阅读和分析ActiveMQ 5.8的源码,开发者不仅可以提升对JMS规范的理解...

    activemq 5.7 官方源代码

    Apache ActiveMQ是业界广泛使用的开源消息中间件,它基于Java平台并遵循...通过分析`activemq-parent-5.7.0`目录下的源码,你可以逐步掌握这个强大的消息中间件的工作原理,进一步提升你的Java和分布式系统开发技能。

    java实现的基于jms协议的消息队列中间件,源码!

    JMS是Java平台上的标准API,它定义了一组接口和规范,使得开发者可以使用不同的消息中间件产品,如ActiveMQ、RabbitMQ或Apache Kafka等。 本项目是个人业余时间开发的,实现了TCP通信方式,这意味着它通过TCP/IP...

    线程安全、网络编程、消息中间件文章源码-ThreadSocket.zip

    常见的消息中间件有RabbitMQ、Apache Kafka和ActiveMQ等。消息中间件可以提供异步通信、解耦合和高可用性等功能,使得分布式系统中的组件可以独立工作,同时保持高效的通信。在"ThreadSocket"项目中,虽然名称未直接...

    ActiveMQ5.4.3源码

    通过深入研究ActiveMQ 5.4.3的源码,开发者不仅能掌握消息中间件的工作机制,还能提升对JMS规范的理解,从而更好地在实际项目中应用和优化消息传递系统。在学习过程中,结合文档和社区资源,将有助于加快理解和解决...

    ActiveMQ 配置文件详解

    **ActiveMQ配置文件详解** ...同时,ActiveMQ的源码分析也是一个深入学习的过程,可以揭示其内部工作原理,有助于解决实际问题。在实际操作中,记得根据自己的需求进行调整,确保服务器的稳定性和性能。

    ActiveMQ快速上手 PDF

    - **定义**:ActiveMQ 是 Apache 软件基金会所研发的一款开源消息中间件,它完全支持 JMS 1.1 和 J2EE 1.4 规范,能够作为 JMS Provider 实现消息传递功能。 - **功能**:ActiveMQ 的核心功能在于帮助实现高性能、高...

    apache-activemq-5.5.1

    总结,Apache ActiveMQ 5.5.1是一个强大且灵活的消息中间件,它提供了稳定的消息传递机制,适用于构建分布式、高并发的系统。了解并熟练使用ActiveMQ,对于提升企业的IT架构质量和效率具有重要意义。

    apache-activemq-5.15.3.zip

    Apache ActiveMQ是Java平台上的一款开源消息中间件,它遵循了开放...通过下载并分析"apache-activemq-5.15.3.zip"中的源码或二进制文件,开发者可以深入理解其工作原理,并定制适合自己应用需求的消息传递解决方案。

    lwl-activemq.zip_activemq_collect6i1

    Apache ActiveMQ是业界广泛使用的开源消息中间件,它遵循JMS(Java Message Service)标准,为分布式系统提供高效、可靠的异步通信。在本压缩包"lwl-activemq.zip_activemq_collect6i1"中,包含了与ActiveMQ相关的...

    配置ActiveMQ 静态集群

    Apache ActiveMQ是开源的消息中间件,它支持多种消息协议,如AMQP、STOMP、MQTT等,并且具备高可用性和可扩展性。本篇文章将详细讲解如何配置ActiveMQ以实现静态集群。 静态集群是ActiveMQ提供的一种高可用性解决...

    结合Spring2.0和ActiveMQ进行异步消息调用

    对于源码分析,可以深入研究Spring的JMS模板和监听容器的实现,理解它们如何与ActiveMQ交互,以及如何配置和定制以满足特定需求。对于工具使用,ActiveMQ的管理控制台可以帮助监控和管理消息队列,包括查看队列状态...

    ActiveMQ例子

    **源码分析** 了解ActiveMQ的内部工作原理,可以通过阅读源码来深入学习。ActiveMQ的源码主要由几个关键组件组成: 1. **Broker**:负责管理和调度消息,处理客户端的连接和断开,以及消息的存储和转发。 2. **...

    spring2 activemq5 tomcat6构建jms

    在构建JMS(Java Message Service)时,Spring框架提供了一套完整的支持,使得开发者能够轻松地集成消息中间件,如ActiveMQ。 ActiveMQ是Apache软件基金会的一个开源项目,它是符合JMS规范的消息代理,用于实现异步...

    Nanomsg 代码分析

    虽然文中提到没有直接针对nanomsg的性能评测数据,但从zeromq和其他消息队列软件(如MSMQ、ActiveMQ、RabbitMQ)的对比来看,zeromq在性能方面表现出色。考虑到nanomsg是在zeromq基础上进一步优化而来的,我们有理由...

    AndroidMqtt源码

    Android MQTT 源码分析主要涉及客户端库的实现,如何在 Android 平台上集成 MQTT 协议,以及如何通过 MQTT 进行数据的发布和订阅。 **1. MQTT 协议基础** MQTT 是基于 TCP/IP 的协议,采用发布/订阅模型,客户端...

    JianLi 在huangbin.rar里面

    结合文件名称“ActiveMQ+in+Action.pdf”,我们可以推断这份文档是关于ActiveMQ的,ActiveMQ是一个开源的消息中间件,它遵循Java消息服务(JMS)规范,用于处理应用程序之间的异步通信。 **ActiveMQ 知识点详解:**...

    JavaCompute_节点创建新消息

    这可能涉及到各种协议,如RMI(远程方法调用)、TCP/IP、HTTP或专门的消息中间件如ActiveMQ、RabbitMQ或Kafka。理解如何设计和实现高效、可靠的节点间消息通信机制至关重要。 4. **源码分析**:标签中的“源码”...

    habari-openmq-20190131-src.zip

    综合以上分析,我们可以看出这个项目是一个使用Delphi语言编写的,通过Stomp协议与OpenMQ消息中间件交互的应用程序。它包括了连接管理、消息处理、通信适配器等多个组件,具有高度可定制性和扩展性。开发人员可以...

Global site tag (gtag.js) - Google Analytics