`
7wolfs
  • 浏览: 182664 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

JMS,ActiveMQ 内部实现的研究

 
阅读更多
问题1,AMQ 4的openWireFormat与AMQ 5的不兼容型问题。
AMQ 4的客户端与AMQ 5的服务端在初次通信时,通过比对自身openWireFormat与AMQ 5发送过来的openWireFormat两者的版本,来确定AMQ 4的客户端选用哪个版本的openWire。现在AMQ 4采用两者之间的最大值,这会造成AMQ 4去使用自身不存在的较高版本的openWire。代码如下:
org.apache.activemq.openwire.OpenWireFormat.renegociatWireFormat 569th line
public void renegociatWireFormat(WireFormatInfo info) throws IOException {
		
	if( preferedWireFormatInfo==null )
		throw new IllegalStateException("Wireformat cannot not be renegociated.");
		
		this.setVersion(Math.max(preferedWireFormatInfo.getVersion(), info.getVersion()) );
		
	}

应该采用两者之间的最小值,代码如下:
public void renegociatWireFormat(WireFormatInfo info) throws IOException {
		
	if( preferedWireFormatInfo==null )
		throw new IllegalStateException("Wireformat cannot not be renegociated.");
		
		this.setVersion(min(preferedWireFormatInfo.getVersion(), info.getVersion()) );
		
	}


问题1,JMS,ActiveMQ的发送消息原理。
比如,发送者发送一个TextMessage对象通过JMS中间件发送到JMS server,JMS server如何拿到这个TextMessage,TextMessage在整个流程中做了哪些处理。

TextMessage的内部处理 (针对TCP OpenFire 协议)
org.apache.activemq.openwire.v1.MessageMarshaller
org.apache.activemq.openwire.v1.BaseCommandMarshaller
这两个类完成Object到bytes的转换。


ActiveMQ 将TextMessage里的text转成byte流,使用socket方式发送二进制流。其中会调用:
org.apache.activemq.command.ActiveMQTextMessage.beforeMarshall(WireFormat wireFormat)

TextMessage中的text转成byte流会调用其中下面一个方法
org.apache.activemq.openwire.v1.BaseDataStreamMarshaller

protected void tightMarshalByteSequence2(ByteSequence data, DataOutput dataOut, BooleanStream bs)
        throws IOException {
        if (bs.readBoolean()) {
            dataOut.writeInt(data.getLength());
            dataOut.write(data.getData(), data.getOffset(), data.getLength());
        }
    }





ActiveMQ 接收时将 bytes二进制流转成ByteSequence对象。会调用下面的方法:
ActiveMQ将ByteSequence放入TextMessage的content,其内容会作为ActiveMQTextMessage.getText() 中的输入源的内容。


org.apache.activemq.command.ActiveMQTextMessage.getText() 


org.apache.activemq.openwire.v1.BaseDataStreamMarshaller.tightUnmarshalByteSequence(DataInput dataIn, BooleanStream bs)

protected ByteSequence tightUnmarshalByteSequence(DataInput dataIn, BooleanStream bs) throws IOException {
        ByteSequence rc = null;
        if (bs.readBoolean()) {
            int size = dataIn.readInt();
            byte[] t = new byte[size];
            dataIn.readFully(t);
            return new ByteSequence(t, 0, size);
        }
        return rc;
    }



分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    activemq 5.5 源码

    ActiveMQ 5.5.0是该中间件的一个早期版本,包含了丰富的特性和功能,适合深入研究其内部工作原理和架构。这个源码包为开发者提供了了解和学习ActiveMQ实现细节的机会。 源码分析可以从以下几个关键知识点开始: 1....

    activemq限流排队

    "源码"标签表明可能涉及到了ActiveMQ的内部实现,理解源码可以帮助开发者更深入地了解其工作原理,从而定制更适合自己的限流策略。例如,通过阅读源码,我们可以知道ActiveMQ如何管理队列,如何调度消息,以及如何...

    ActiveMQ实例,源代码

    在提供的源代码实例中,我们可以深入研究 ActiveMQ 的 API 使用、消息生产与消费的实现、队列和主题的配置等。这将有助于我们理解 ActiveMQ 内部的工作机制,如何优化消息传递性能,以及如何处理异常情况。 - **...

    activemq-pool源码

    Apache ActiveMQ是业界广泛使用的开源消息中间件,它提供了高效、可靠的异步消息传递功能。在ActiveMQ中,`activemq-pool`...同时,深入研究`activemq-pool`的实现也能为开发者提供设计和实现其他类型池化服务的参考。

    activemq4.0.1源码

    总之,ActiveMQ 4.0.1源码分析将帮助你深入理解消息中间件的内部运作,这对于开发、调试或定制自己的消息服务非常有价值。在研究源码时,结合官方文档和社区资源,将有助于你更有效地学习和应用这些知识。

    ActiveMQ 5.7源码及jar包

    3. **API使用**:通过导入ActiveMQ的JMS API,开发者可以在应用中创建连接工厂、会话、消息生产者和消费者,实现消息的发送和接收。 帮助文档与示例: 1. **快速入门**:帮助文档通常包含快速入门指南,指导用户...

    activeMQ5.8源码

    1. **JMS接口与实现**:ActiveMQ作为JMS提供者,实现了JMS规范中的ConnectionFactory、Destination、MessageProducer、MessageConsumer等核心接口。通过源码可以学习如何创建和管理这些对象,以及它们在消息发送和...

    apache-activemq-5.13.2.rar

    Apache ActiveMQ是业界广泛使用的开源消息中间件,它基于Java Message Service (JMS) 规范,提供高效、可靠的...通过解压并研究"apache-activemq-5.13.2"中的文件,你可以更深入地了解其内部工作原理和具体配置方法。

    ActiveMQ笔记

    对于源码级别的理解和优化,开发者可以研究ActiveMQ的GitHub仓库,了解其内部工作机制,包括消息的序列化、调度策略、网络通信等方面。 8. **工具支持** 除了Web管理界面,ActiveMQ还提供了命令行工具和各种语言...

    activemq-5.16.2-源码包,源码包资源

    ActiveMQ 5.16.2是该软件的一个版本,包含了源码,这对于开发者来说是极其宝贵的资源,因为它允许深入理解其内部工作原理,并进行自定义开发或调试。 源码包资源"activemq-parent-5.16.2-source-release.zip"是整个...

    activemq 5.15.15源码包,源码包

    源码包的分享对于开发者来说是一个宝贵的学习和研究资源,可以深入理解其内部机制和工作原理。 ActiveMQ的核心功能包括: 1. **多协议支持**:ActiveMQ 支持多种通信协议,如OpenWire、STOMP、AMQP、MQTT和WS-MQ,...

    ActiveMQ消息服务器 v5.18.3.zip

    在`ActiveMQ v5.18.3.zip`中,包含的是ActiveMQ的源代码,这对于学习和理解其内部工作原理,以及进行定制化开发或毕业设计论文研究非常有价值。这个版本的ActiveMQ可能包含以下组件和功能: 1. **核心消息引擎**:...

    ActiveMQ的学习

    - 对于技术爱好者,深入研究 ActiveMQ 源码有助于理解其内部机制,如消息路由、存储和调度策略,以及如何优化性能。 7. **使用场景** - 微服务架构中,作为服务间通信的桥梁,解耦系统组件。 - 数据批处理,异步...

    消息中间件-activeMQ.zip

    在"activeMQ-master"这个源码包中,开发者可以研究ActiveMQ的源代码,理解其内部机制,包括消息的生产、消费、存储、调度等过程。此外,还可以根据需求自定义配置文件,优化性能,或者开发适配特定场景的插件。深入...

    activemq-src

    开发者可以通过研究源代码学习到ActiveMQ的内部实现,例如消息的路由策略、存储机制、网络通信等,这对于理解消息中间件的工作原理和优化性能非常有帮助。同时,源代码也是贡献代码、参与开源项目的重要途径。

    java jms 源码都在其中

    在这个"java jms 源码都在其中"的压缩包中,我们可以深入理解Java JMS和Spring JMS的内部工作机制。源码分析对于学习和掌握这些技术至关重要,因为它允许我们看到底层的实现细节,了解如何创建连接、发布和订阅消息...

    activemq学习(1)

    ActiveMQ的源代码是开放的,开发者可以深入研究其内部实现,了解消息的存储、传输和调度机制,甚至进行定制和扩展。 “工具”标签可能意味着ActiveMQ与其他开发工具的集成,如IDE插件,这些工具可以帮助开发者更...

    ActiveMQ 初识

    在源码层面,ActiveMQ的架构设计值得深入研究。其核心组件包括Broker(消息代理)、Producer(生产者)、Consumer(消费者)、Destination(消息目标,如Queue或Topic)等。源码阅读可以帮助开发者理解其内部的工作...

    ActiveMQ in Action

    ActiveMQ是Java消息服务(JMS)的一个实现,广泛应用于分布式系统中的异步通信和解耦。在这个项目中,我们可以看到与这本书相关的源代码和配置文件,这为我们提供了学习和理解ActiveMQ实际操作的机会。 首先,`....

Global site tag (gtag.js) - Google Analytics