activemq-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "caoyunfei (JIRA)" <j...@apache.org>
Subject [jira] [Updated] (AMQ-4887) ActiveMQBytesMessage will lost content if message's property was set before copy
Date Fri, 15 Nov 2013 05:13:21 GMT

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

caoyunfei updated AMQ-4887:
---------------------------

    Description: 
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    }

  was:
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    }


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

Mime
View raw message