[ 
https://issues.apache.org/jira/browse/AMQ-4887?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Timothy Bish reassigned AMQ-4887:
---------------------------------

    Assignee: Timothy Bish  (was: Kevin Earls)

> 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)

Reply via email to