[
https://issues.apache.org/jira/browse/AMQ-4887?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Timothy Bish resolved AMQ-4887.
-------------------------------
Resolution: Fixed
Fix Version/s: 5.10.0
Wrapped this one up as I was afraid I might be seeing this in some AMQP
dispatch scenarios.
> 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
> Fix For: 5.10.0
>
> Attachments: AMQ-4887.patch, 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.4#6159)