Return-Path: X-Original-To: apmail-activemq-dev-archive@www.apache.org Delivered-To: apmail-activemq-dev-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 6A1D610914 for ; Fri, 15 Nov 2013 04:03:38 +0000 (UTC) Received: (qmail 76415 invoked by uid 500); 15 Nov 2013 04:03:31 -0000 Delivered-To: apmail-activemq-dev-archive@activemq.apache.org Received: (qmail 76159 invoked by uid 500); 15 Nov 2013 04:03:27 -0000 Mailing-List: contact dev-help@activemq.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@activemq.apache.org Delivered-To: mailing list dev@activemq.apache.org Received: (qmail 76147 invoked by uid 99); 15 Nov 2013 04:03:21 -0000 Received: from arcas.apache.org (HELO arcas.apache.org) (140.211.11.28) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 15 Nov 2013 04:03:21 +0000 Date: Fri, 15 Nov 2013 04:03:20 +0000 (UTC) From: "caoyunfei (JIRA)" To: dev@activemq.apache.org Message-ID: In-Reply-To: References: Subject: [jira] [Created] (AMQ-4887) ActiveMQBytesMessage will lost content if message's property was set before copy MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-JIRA-FingerPrint: 30527f35849b9dde25b450d4833f0394 caoyunfei created AMQ-4887: ------------------------------ Summary: 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 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 } -- This message was sent by Atlassian JIRA (v6.1#6144)