JMS,ActiveMQ 内部兑现的研究
JMS,ActiveMQ 内部实现的研究
问题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流会调用其中下面一个方法
ActiveMQ 接收时将 bytes二进制流转成ByteSequence对象。会调用下面的方法:
ActiveMQ将ByteSequence放入TextMessage的content,其内容会作为ActiveMQTextMessage.getText() 中的输入源的内容。
问题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; }