This is an automated email from the ASF dual-hosted git repository.

jbonofre pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/activemq.git


The following commit(s) were added to refs/heads/main by this push:
     new ad9a30dfa0 feat(#1797): add message delivery tracking to 
QueueMessageReference (#1796)
ad9a30dfa0 is described below

commit ad9a30dfa0835c1712b794d0ea00f16cd79981fa
Author: Jean-Louis Monteiro <[email protected]>
AuthorDate: Thu Jul 9 16:37:59 2026 +0200

    feat(#1797): add message delivery tracking to QueueMessageReference (#1796)
    
    * feat: add message delivery tracking to QueueMessageReference
    
    Add isDelivered()/setDelivered() to QueueMessageReference interface
    with implementations in IndirectMessageReference (boolean field) and
    NullMessageReference (no-op). PrefetchSubscription.acknowledge() now
    marks messages as delivered=true when processing DeliveredAck, enabling
    downstream consumers to distinguish delivered-but-unacked messages.
    
    * fix: incorporate feedback
---
 .../activemq/broker/region/IndirectMessageReference.java | 16 ++++++++++++++--
 .../activemq/broker/region/NullMessageReference.java     |  9 +++++++++
 .../activemq/broker/region/PrefetchSubscription.java     | 16 +++++++++-------
 .../activemq/broker/region/QueueMessageReference.java    |  4 ++++
 4 files changed, 36 insertions(+), 9 deletions(-)

diff --git 
a/activemq-broker/src/main/java/org/apache/activemq/broker/region/IndirectMessageReference.java
 
b/activemq-broker/src/main/java/org/apache/activemq/broker/region/IndirectMessageReference.java
index 104dcb0a4a..047c34f860 100644
--- 
a/activemq-broker/src/main/java/org/apache/activemq/broker/region/IndirectMessageReference.java
+++ 
b/activemq-broker/src/main/java/org/apache/activemq/broker/region/IndirectMessageReference.java
@@ -35,6 +35,8 @@ public class IndirectMessageReference implements 
QueueMessageReference {
     private boolean dropped;
     /** Has the message been acked? */
     private boolean acked;
+    /** Has the message been delivered? */
+    private boolean delivered;
     /** Direct reference to the message */
     private final Message message;
     private final MessageId messageId;
@@ -197,16 +199,26 @@ public class IndirectMessageReference implements 
QueueMessageReference {
 
     @Override
     public synchronized int getSize() {
-       return message.getSize();
+        return message.getSize();
     }
 
     @Override
     public boolean isAdvisory() {
-       return message.isAdvisory();
+        return message.isAdvisory();
     }
 
     @Override
     public boolean canProcessAsExpired() {
         return message.canProcessAsExpired();
     }
+
+    @Override
+    public synchronized boolean isDelivered() {
+        return delivered;
+    }
+
+    @Override
+    public synchronized void setDelivered(final boolean delivered) {
+        this.delivered = delivered;
+    }
 }
diff --git 
a/activemq-broker/src/main/java/org/apache/activemq/broker/region/NullMessageReference.java
 
b/activemq-broker/src/main/java/org/apache/activemq/broker/region/NullMessageReference.java
index e8d26a84fc..8d2edf8895 100644
--- 
a/activemq-broker/src/main/java/org/apache/activemq/broker/region/NullMessageReference.java
+++ 
b/activemq-broker/src/main/java/org/apache/activemq/broker/region/NullMessageReference.java
@@ -159,4 +159,13 @@ public final class NullMessageReference implements 
QueueMessageReference {
         return false;
     }
 
+    @Override
+    public boolean isDelivered() {
+        return false;
+    }
+
+    @Override
+    public void setDelivered(boolean delivered) {
+
+    }
 }
diff --git 
a/activemq-broker/src/main/java/org/apache/activemq/broker/region/PrefetchSubscription.java
 
b/activemq-broker/src/main/java/org/apache/activemq/broker/region/PrefetchSubscription.java
index b2adf56a67..2fa6203bc5 100644
--- 
a/activemq-broker/src/main/java/org/apache/activemq/broker/region/PrefetchSubscription.java
+++ 
b/activemq-broker/src/main/java/org/apache/activemq/broker/region/PrefetchSubscription.java
@@ -270,13 +270,15 @@ public abstract class PrefetchSubscription extends 
AbstractSubscription {
             } else if (ack.isDeliveredAck()) {
                 // Message was delivered but not acknowledged: update pre-fetch
                 // counters.
-                int index = 0;
-                for (Iterator<MessageReference> iter = dispatched.iterator(); 
iter.hasNext(); index++) {
-                    final MessageReference node = iter.next();
-                    Destination nodeDest = (Destination) 
node.getRegionDestination();
-                    if (ack.getLastMessageId().equals(node.getMessageId())) {
+
+                for (final MessageReference node : dispatched) {
+                    final MessageId messageId = node.getMessageId();
+                    if (node instanceof QueueMessageReference) {
+                        ((QueueMessageReference) node).setDelivered(true);
+                    }
+                    if (ack.getLastMessageId().equals(messageId)) {
                         expandPrefetchExtension(ack.getMessageCount());
-                        destination = nodeDest;
+                        destination = (Destination) 
node.getRegionDestination();
                         callDispatchMatched = true;
                         break;
                     }
@@ -396,7 +398,7 @@ public abstract class PrefetchSubscription extends 
AbstractSubscription {
     }
 
     protected void processExpiredAck(final ConnectionContext context, final 
Destination dest,
-        final MessageReference node) {
+                                     final MessageReference node) {
         dest.messageExpired(context, this, node);
     }
 
diff --git 
a/activemq-broker/src/main/java/org/apache/activemq/broker/region/QueueMessageReference.java
 
b/activemq-broker/src/main/java/org/apache/activemq/broker/region/QueueMessageReference.java
index 0f9bf47150..e7aa06add4 100644
--- 
a/activemq-broker/src/main/java/org/apache/activemq/broker/region/QueueMessageReference.java
+++ 
b/activemq-broker/src/main/java/org/apache/activemq/broker/region/QueueMessageReference.java
@@ -42,4 +42,8 @@ public interface QueueMessageReference extends 
MessageReference {
     boolean unlock();
 
     LockOwner getLockOwner();
+
+    boolean isDelivered();
+
+    void setDelivered(boolean delivered);
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]
For further information, visit: https://activemq.apache.org/contact


Reply via email to