[ https://issues.apache.org/jira/browse/AMQ-4887?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13840219#comment-13840219 ]
Timothy Bish commented on AMQ-4887: ----------------------------------- I'm also going to guess that the StreamMessage implementation suffers from the same problem and the test should be expanded to check that message too, as well as the compressed case. > 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 > Assignee: Timothy Bish > Attachments: AMQ-4887.patch, ActiveMQBytesMessage.java.patch, > ActiveMQBytesMessageTest.java, Consumer.java, Producer.java > > Original Estimate: 24h > Remaining Estimate: 24h > > 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: > ActiveMQBytesMessage : > private void 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)