ActiveMQ源码架构解析第一节(转)

本文涉及的产品
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
简介:   工作四年已久,也快到了而立之年,本人也酷爱技术,总是想找一些途径来提升自己,想着温故而知新所以就写起了博客,然而写博客这个想法也是酝酿了很久,近期也看到了有很多人在问关于ActiveMQ的相关问题,有幸接触ActiveMQ从今天开始我会定期总结一些关于ActiveMQ的相关知识,本篇重点是先分析ActiveMQ的架构以及设计模式等相关知识,然后在说如何更好的使用,让ActiveMQ发挥最好的性能,欢迎大家跟帖讨论,有错误的地方还请大家不吝雅正,小方在此谢过!   第一篇文章我们先从hello world写起,下面是使用java代码调用activemq的api发送一条消息。

 

  工作四年已久,也快到了而立之年,本人也酷爱技术,总是想找一些途径来提升自己,想着温故而知新所以就写起了博客,然而写博客这个想法也是酝酿了很久,近期也看到了有很多人在问关于ActiveMQ的相关问题,有幸接触ActiveMQ从今天开始我会定期总结一些关于ActiveMQ的相关知识,本篇重点是先分析ActiveMQ的架构以及设计模式等相关知识,然后在说如何更好的使用,让ActiveMQ发挥最好的性能,欢迎大家跟帖讨论,有错误的地方还请大家不吝雅正,小方在此谢过!

 

第一篇文章我们先从hello world写起,下面是使用java代码调用activemq的api发送一条消息。

 

public class test {

    public static void main(String[] args) throws Exception {

       ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(

              "tcp://localhost:61616");

       Connection connection = connectionFactory.createConnection(); 

       connection.start();      

       Session session = connection.createSession(false,

              Session.AUTO_ACKNOWLEDGE);

       MessageProducer producer = session.createProducer(session

              .createQueue("testQueue"));

       Message message = session.createTextMessage("hello everybody!");

       producer.send(message);

       producer.close();

       session.close();

       connection.close();

    }

}

 

 

 

下面来分析发送消息的几个步骤,如下:

 

1、创建ActiveMQConnectionFactory,入参是url,指定schema以及要连接的ip和端口号,其次是创建ActiveMQConnection,tcp协议交互肯定是要使用Socket类,所以说明下ActiveMQConnection->Transport->Socket的关系,Transport是对Socket的封装,而ActiveMQConnection则是对Transport的封装,如下图所示:

 

2、创建ActiveMQConnection,因为上图已经说明ActiveMQConnection和Transport是组合关系,所以创建ActiveMQConnection时首先要创建Transport,因为ActiveMQ的交互方式分为Tcp、Udp以及HTTP协议,ActiveMQ使用了非常经典的简单工厂设计模式,使用这个模式的好处是工厂可以根据uri的schema头来动态创建相应的TransportFactory工厂,例如用户输入tcp://localhost:61616,ObjectFactory则可以获取到schema是tcp然后来实例化TcpTransportFactory,然后在调用TcpTransportFactory工厂来生产TcpTransport对象,简单工厂模式如下图,我是把2个工厂画到了一起:          创建完TcpTransport还不够,因为TcpTransport只实现了发送和接受消息,还需要做一些封装来实现相应的业务处理,说到封装这里使用到了包装设计模式,也叫装饰者模式,jdk的java.io输入输出流也有使用,类图如下:   

1、1、MutexTransportFilter类实现了对每个请求的同步锁,同一时间只允许发送一个请求,如果有第二个请求需要等待第一个请求发送完毕才可继续发送。

 

2、2、WireFormatNegotiator类实现了在客户端连接broker的时候先发送数据解析相关的协议信息,例如解析版本号,是否使用缓存等信息。

 

3、3、InactivityMonitor类实现了连接成功后启动心跳检查机制,客户端每10秒发送一次心跳信息,服务端每30秒读一次心跳信息,如果没有读到则会断开连接,心跳检测是相互的,客户端也会每30秒读取服务端发送来的心跳信息,如果没有读到也一样会断开连接。

 

4、4、ResponseCorrelator类实现了异步请求但需要获取响应信息否则就会阻塞等待功能。

 

创建ActiveMQConnection的时序图如下:

 

 

客户端调用createConnection()方法,通过TcpTransportFactory获取到TcpTransport对象,得到TcpTransport对象后,TcpTransportFactory又调用自己的configure方法对TcpTransport进行了包装,代码如下:

 

public Transport configure(Transport transport, WireFormat wf, Map options) throws Exception {

    transport = compositeConfigure(transport, wf, options);

    transport = new MutexTransport(transport);

    transport = new ResponseCorrelator(transport);

    return transport;

}

 

这就是包装设计模式的使用,当调用transport.request()发送消息时,时序图如下:

 

       每次transport调用request方法时都会先判断next是否为空,如果不为空则先调用next.request(),当然在调用之前和之后都会加入相应的逻辑,包装设计模式的好处就是当我不想启动心跳检测功能时则可以非常简单的实现,只需要不为WireFormatNegotiator设置next属性为InactivityMonitor即可,获取加入其它功能不需要修改原来的设计只需要新增一个类即可,充分的体现了设计模式的开放封闭原则以及单一职责原则,设计模式在ActiveMQ中可以说是使用的淋漓尽致,恰到好处。

 

    创建完ActiveMQConnection之后就是创建ActiveMQSession以及ActiveMQMessageProducer了,这两个对象的创建就比较简单了没什么可说的,当然在创建这些对象的时候客户端会发送相应的信息给服务端,本节主要讲解连接的建立。信息的交互以及Message的发送就留到下一节在说了,第一次写这么长的博文,可能有的地方讲的思路不清晰,还请大家多多指正,谢谢大家,睡觉了,明天还要加班!

http://www.iteye.com/topic/1137523

 

目录
打赏
0
0
0
0
95
分享
相关文章
深入解析Tiktokenizer:大语言模型中核心分词技术的原理与架构
Tiktokenizer 是一款现代分词工具,旨在高效、智能地将文本转换为机器可处理的离散单元(token)。它不仅超越了传统的空格分割和正则表达式匹配方法,还结合了上下文感知能力,适应复杂语言结构。Tiktokenizer 的核心特性包括自适应 token 分割、高效编码能力和出色的可扩展性,使其适用于从聊天机器人到大规模文本分析等多种应用场景。通过模块化设计,Tiktokenizer 确保了代码的可重用性和维护性,并在分词精度、处理效率和灵活性方面表现出色。此外,它支持多语言处理、表情符号识别和领域特定文本处理,能够应对各种复杂的文本输入需求。
34 6
深入解析Tiktokenizer:大语言模型中核心分词技术的原理与架构
从入门到精通:H5游戏源码开发技术全解析与未来趋势洞察
H5游戏凭借其跨平台、易传播和开发成本低的优势,近年来发展迅猛。接下来,让我们深入了解 H5 游戏源码开发的技术教程以及未来的发展趋势。
2025年阿里云弹性裸金属服务器架构解析与资源配置方案
🚀 核心特性与技术创新:提供100%物理机性能输出,支持NVIDIA A100/V100 GPU直通,无虚拟化层损耗。网络与存储优化,400万PPS吞吐量,ESSD云盘IOPS达100万,RDMA延迟<5μs。全球部署覆盖华北、华东、华南及海外节点,支持跨地域负载均衡。典型应用场景包括AI训练、科学计算等,支持分布式训练和并行计算框架。弹性裸金属服务器+OSS存储+高速网络综合部署,满足高性能计算需求。
在线教育网课系统源码开发指南:功能设计与技术实现深度解析
在线教育网课系统是近年来发展迅猛的教育形式的核心载体,具备用户管理、课程管理、教学互动、学习评估等功能。本文从功能和技术两方面解析其源码开发,涵盖前端(HTML5、CSS3、JavaScript等)、后端(Java、Python等)、流媒体及云计算技术,并强调安全性、稳定性和用户体验的重要性。
|
2月前
|
Spring底层架构核心概念解析
理解 Spring 框架的核心概念对于开发和维护 Spring 应用程序至关重要。IOC 和 AOP 是其两个关键特性,通过依赖注入和面向切面编程实现了高效的模块化和松耦合设计。Spring 容器管理着 Beans 的生命周期和配置,而核心模块为各种应用场景提供了丰富的功能支持。通过全面掌握这些核心概念,开发者可以更加高效地利用 Spring 框架开发企业级应用。
86 18
智慧工地云平台的技术架构解析:微服务+Spring Cloud如何支撑海量数据?
慧工地解决方案依托AI、物联网和BIM技术,实现对施工现场的全方位、立体化管理。通过规范施工、减少安全隐患、节省人力、降低运营成本,提升工地管理的安全性、效率和精益度。该方案适用于大型建筑、基础设施、房地产开发等场景,具备微服务架构、大数据与AI分析、物联网设备联网、多端协同等创新点,推动建筑行业向数字化、智能化转型。未来将融合5G、区块链等技术,助力智慧城市建设。
mindspeed-llm源码解析(一)preprocess_data
mindspeed-llm是昇腾模型套件代码仓,原来叫"modelLink"。这篇文章带大家阅读一下数据处理脚本preprocess_data.py(基于1.0.0分支),数据处理是模型训练的第一步,经常会用到。
68 0
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
141 2
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是"将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。创建型模式分为5种:单例模式、工厂方法模式抽象工厂式、原型模式、建造者模式。
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析

热门文章

最新文章

推荐镜像

更多
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等