You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ta...@apache.org on 2015/10/12 22:12:01 UTC

qpid-jms git commit: QPIDJMS-123 Add additional protections from possible NPE on concurrent access.

Repository: qpid-jms
Updated Branches:
  refs/heads/master fa7445ffb -> 75f3cf8d2


QPIDJMS-123 Add additional protections from possible NPE on concurrent
access.



Project: http://git-wip-us.apache.org/repos/asf/qpid-jms/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-jms/commit/75f3cf8d
Tree: http://git-wip-us.apache.org/repos/asf/qpid-jms/tree/75f3cf8d
Diff: http://git-wip-us.apache.org/repos/asf/qpid-jms/diff/75f3cf8d

Branch: refs/heads/master
Commit: 75f3cf8d2b94f495af6c130856ae8a9904ce670b
Parents: fa7445f
Author: Timothy Bish <ta...@gmail.com>
Authored: Mon Oct 12 16:11:41 2015 -0400
Committer: Timothy Bish <ta...@gmail.com>
Committed: Mon Oct 12 16:11:41 2015 -0400

----------------------------------------------------------------------
 .../org/apache/qpid/jms/JmsQueueBrowser.java    | 78 ++++++++++----------
 1 file changed, 38 insertions(+), 40 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/75f3cf8d/qpid-jms-client/src/main/java/org/apache/qpid/jms/JmsQueueBrowser.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/main/java/org/apache/qpid/jms/JmsQueueBrowser.java b/qpid-jms-client/src/main/java/org/apache/qpid/jms/JmsQueueBrowser.java
index 1bb1ac6..af1096b 100644
--- a/qpid-jms-client/src/main/java/org/apache/qpid/jms/JmsQueueBrowser.java
+++ b/qpid-jms-client/src/main/java/org/apache/qpid/jms/JmsQueueBrowser.java
@@ -23,6 +23,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
 import javax.jms.IllegalStateException;
 import javax.jms.JMSException;
 import javax.jms.Message;
+import javax.jms.MessageConsumer;
 import javax.jms.Queue;
 import javax.jms.QueueBrowser;
 
@@ -61,7 +62,7 @@ public class JmsQueueBrowser implements QueueBrowser, Enumeration<Message> {
     private final JmsDestination destination;
     private final String selector;
 
-    private JmsMessageConsumer consumer;
+    private volatile JmsMessageConsumer consumer;
 
     private Message next;
     private final AtomicBoolean closed = new AtomicBoolean();
@@ -84,18 +85,6 @@ public class JmsQueueBrowser implements QueueBrowser, Enumeration<Message> {
         this.selector = selector;
     }
 
-    private void destroyConsumer() {
-        if (consumer == null) {
-            return;
-        }
-        try {
-            consumer.close();
-            consumer = null;
-        } catch (JMSException e) {
-            e.printStackTrace();
-        }
-    }
-
     /**
      * Gets an enumeration for browsing the current queue messages in the order they would be
      * received.
@@ -108,16 +97,9 @@ public class JmsQueueBrowser implements QueueBrowser, Enumeration<Message> {
     @Override
     public Enumeration<Message> getEnumeration() throws JMSException {
         checkClosed();
-        if (consumer == null) {
-            consumer = createConsumer();
-        }
-        return this;
-    }
+        createConsumer();
 
-    private void checkClosed() throws IllegalStateException {
-        if (closed.get()) {
-            throw new IllegalStateException("The Consumer is closed");
-        }
+        return this;
     }
 
     /**
@@ -126,10 +108,9 @@ public class JmsQueueBrowser implements QueueBrowser, Enumeration<Message> {
     @Override
     public boolean hasMoreElements() {
         while (true) {
-            synchronized (this) {
-                if (consumer == null) {
-                    return false;
-                }
+            MessageConsumer consumer = this.consumer;
+            if (consumer == null) {
+                return false;
             }
 
             if (next == null) {
@@ -160,11 +141,6 @@ public class JmsQueueBrowser implements QueueBrowser, Enumeration<Message> {
      */
     @Override
     public Message nextElement() {
-        synchronized (this) {
-            if (consumer == null) {
-                return null;
-            }
-        }
 
         if (hasMoreElements()) {
             Message message = next;
@@ -195,7 +171,6 @@ public class JmsQueueBrowser implements QueueBrowser, Enumeration<Message> {
      *         if the JMS provider fails to get the queue associated with this browser due to
      *         some internal error.
      */
-
     @Override
     public Queue getQueue() throws JMSException {
         return (Queue) destination;
@@ -212,15 +187,38 @@ public class JmsQueueBrowser implements QueueBrowser, Enumeration<Message> {
         return "JmsQueueBrowser { value=" + (consumer != null ? consumer.getConsumerId() : "null") + " }";
     }
 
-    private JmsMessageConsumer createConsumer() throws JMSException {
-        JmsMessageConsumer rc = new JmsMessageConsumer(session.getNextConsumerId(), session, destination, selector, false) {
+    private void checkClosed() throws IllegalStateException {
+        if (closed.get()) {
+            throw new IllegalStateException("The Consumer is closed");
+        }
+    }
 
-            @Override
-            public boolean isBrowser() {
-                return true;
+    private synchronized void destroyConsumer() {
+        synchronized (this) {
+            try {
+                if (consumer != null) {
+                    consumer.close();
+                    consumer = null;
+                }
+            } catch (JMSException e) {
+                LOG.warn("Error closing down internal consumer: ", e);
             }
-        };
-        rc.init();
-        return rc;
+        }
+    }
+
+    private synchronized void createConsumer() throws JMSException {
+        if (consumer == null) {
+            JmsMessageConsumer result = new JmsMessageConsumer(session.getNextConsumerId(), session, destination, selector, false) {
+
+                @Override
+                public boolean isBrowser() {
+                    return true;
+                }
+            };
+            result.init();
+
+            // Assign only after fully created and initialized.
+            consumer = result;
+        }
     }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org