This is an automated email from the ASF dual-hosted git repository. clebertsuconic pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/activemq-artemis.git
commit 23bbf76bdfdf56b3088b5149c152d05c86709717 Author: Clebert Suconic <[email protected]> AuthorDate: Mon Apr 3 09:55:48 2023 -0400 ARTEMIS-4233 Avoiding holder.iter=null with a compile time validation --- .../artemis/core/server/impl/QueueImpl.java | 24 ++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/QueueImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/QueueImpl.java index e27b89eea2..39b71d5526 100644 --- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/QueueImpl.java +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/QueueImpl.java @@ -3093,9 +3093,21 @@ public class QueueImpl extends CriticalComponentImpl implements Queue { break; } - ConsumerHolder<? extends Consumer> holder; + final ConsumerHolder<? extends Consumer> holder; + final LinkedListIterator<MessageReference> holderIterator; if (consumers.hasNext()) { holder = consumers.next(); + if (holder == null) { + // this shouldn't happen, however I'm adding this check just in case + logger.debug("consumers.next() returned null."); + consumers.remove(); + deliverAsync(true); + return false; + } + if (holder.iter == null) { + holder.iter = messageReferences.iterator(); + } + holderIterator = holder.iter; } else { pruneLastValues(); break; @@ -3112,12 +3124,8 @@ public class QueueImpl extends CriticalComponentImpl implements Queue { return false; } - if (holder.iter == null) { - holder.iter = messageReferences.iterator(); - } - - if (holder.iter.hasNext()) { - ref = holder.iter.next(); + if (holderIterator.hasNext()) { + ref = holderIterator.next(); } else { ref = null; } @@ -3167,7 +3175,7 @@ public class QueueImpl extends CriticalComponentImpl implements Queue { consumers.reset(); } else if (status == HandleStatus.BUSY) { try { - holder.iter.repeat(); + holderIterator.repeat(); } catch (NoSuchElementException e) { // this could happen if there was an exception on the queue handling // and it returned BUSY because of that exception
