[ 
https://issues.apache.org/jira/browse/AMQ-4887?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13840214#comment-13840214
 ] 

Timothy Bish commented on AMQ-4887:
-----------------------------------

The fix seems reasonable but I think there's still a problem here if the 
content is stored compressed.  If you simply rewrite the contents into the 
output stream and message compression is enabled you'd be writing compressed 
data with an output stream that's doing compression again so that's not good, 
plus you be adding new data onto already compressed content if you use any of 
the write methods so you are doubly corrupted.  

> 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