From ea09159a4087212964787e7cf68ef30170d115f0 Mon Sep 17 00:00:00 2001 From: "Christopher L. Shannon (cshannon)" Date: Mon, 21 Mar 2016 19:17:26 +0000 Subject: [PATCH] https://issues.apache.org/jira/browse/AMQ-6218 Fixing copy method of ActiveMQTextMessage to prevent a race condition when concurrent store and dispatch is used with Queues We may need explicity synchronization between the text and content fields in the future if other issues pop up --- .../org/apache/activemq/command/ActiveMQTextMessage.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/activemq-client/src/main/java/org/apache/activemq/command/ActiveMQTextMessage.java b/activemq-client/src/main/java/org/apache/activemq/command/ActiveMQTextMessage.java index 97fc9e4aa1..4618341ee3 100755 --- a/activemq-client/src/main/java/org/apache/activemq/command/ActiveMQTextMessage.java +++ b/activemq-client/src/main/java/org/apache/activemq/command/ActiveMQTextMessage.java @@ -55,6 +55,12 @@ public class ActiveMQTextMessage extends ActiveMQMessage implements TextMessage } private void copy(ActiveMQTextMessage copy) { + //AMQ-6218 - Save text before calling super.copy() to prevent a race condition when + //concurrent store and dispatch is enabled in KahaDB + //The issue is sometimes beforeMarshall() gets called in between the time content and + //text are copied to the new object leading to both fields being null when text should + //not be null + String text = this.text; super.copy(copy); copy.text = text; } @@ -79,9 +85,11 @@ public class ActiveMQTextMessage extends ActiveMQMessage implements TextMessage @Override public String getText() throws JMSException { ByteSequence content = getContent(); + String text = this.text; if (text == null && content != null) { text = decodeContent(content); + this.text = text; setContent(null); setCompressed(false); }