caoyunfei created AMQ-4887:
------------------------------
Summary: ActiveMQBytesMessage will lost content if message's
property was set before copy
Key: AMQ-4887
URL: https://issues.apache.org/jira/browse/AMQ-4887
Project: ActiveMQ
Issue Type: Bug
Components: Broker
Affects Versions: 5.9.0
Reporter: caoyunfei
ActiveMQBytesMessage will lost content if message's property was set before
copy. Here is the test code:
Producer:
MessageProducer producer;
//initialize Connection, Session, MessageProducer
byte[] bs = "bytes message".getBytes();
BytesMessage message = session.createBytesMessage();
message.writeBytes(bs); //write bytes to message 1
for(int i=0; i< 0; i++){
// then set message's propery 2
message.setLongProperty("sendTime", System.currentTimeMillis());
try{
producer.send(message);
}catch(){
e.printStackTrace();
}
}
Consumer:
MessageConsumer consumer
//initailize Connection, Session, MessageConsumer
for(int i=0; i<10; i++){
ActiveMQBytesMessage msg = (ActiveMQBytesMessage)consumer.receive(60*1000);
long sendTime = message.getLongProperty("sendTime");
System.out.println("sendtime:" + sendTime);
ByteSequence bs = message.getMessage().getContent();
System.out.println("bytes data:" + new String(bs.getData()));
}
Expected result:
consumer gets bytes data in all received messages
Actual result:
only the fisrt message has bytes data, all other messages lost bytes data,
while long property value is not lost;
Analysization:
message gets copied when send, it will call storeContent() before copy,
DataOutputStream dataOut will be closed and the data in dataOut will be set to
conent. This works correctly if there are no property was set.
when setLongProperty was called, it will call setObjectProperty() then will
call initializeWriting(), here DataOutputStream dataOut will be create AGAIN.
So when message was copied in second time, DataOutputStream dataOut is NOT
null, but EMPTY, it will clear the value in content.
suggestion:
restore the content data to DataOutputStream dataOut when nitializeWriting()
my fix:
private void More ...initializeWriting() throws JMSException {
669 The original code
......
701 }
//fix code
if(this.content !=null && this.content.length >0){
try{
this.dataOut.write(this.content.getData());
}catch(IOException ioe){
throw JMSExceptionSupport.create(ioe);
}
}
702 }
--
This message was sent by Atlassian JIRA
(v6.1#6144)