tkaymak commented on code in PR #39253:
URL: https://github.com/apache/beam/pull/39253#discussion_r3602766988


##########
sdks/java/io/jms/src/main/java/org/apache/beam/sdk/io/jms/JmsCheckpointMark.java:
##########
@@ -41,29 +45,32 @@ class JmsCheckpointMark implements 
UnboundedSource.CheckpointMark, Serializable
   private static final Logger LOG = 
LoggerFactory.getLogger(JmsCheckpointMark.class);
 
   private Instant oldestMessageTimestamp;
-  private transient @Nullable Message lastMessage;
+  private transient @Nullable List<Message> messages;
   private transient @Nullable MessageConsumer consumer;
   private transient @Nullable Session session;
+  private transient @Nullable AtomicInteger activeCheckpoints;
 
   private JmsCheckpointMark(
       Instant oldestMessageTimestamp,
-      @Nullable Message lastMessage,
+      @Nullable List<Message> messages,
       @Nullable MessageConsumer consumer,
-      @Nullable Session session) {
+      @Nullable Session session,
+      @Nullable AtomicInteger activeCheckpoints) {
     this.oldestMessageTimestamp = oldestMessageTimestamp;
-    this.lastMessage = lastMessage;
+    this.messages = messages;
     this.consumer = consumer;
     this.session = session;
+    this.activeCheckpoints = activeCheckpoints;
   }
 
   /** Acknowledge all outstanding message. */
   @Override
   public void finalizeCheckpoint() {
     try {
-      // Jms spec will implicitly acknowledge _all_ messaged already received 
by the same
-      // session if one message in this session is being acknowledged.
-      if (lastMessage != null) {
-        lastMessage.acknowledge();
+      if (messages != null) {
+        for (Message message : messages) {
+          message.acknowledge();

Review Comment:
   Thanks for pushing back. 
   I checked the ActiveMQ and Qpid client internals and you are right in 
practice. 
   1. ActiveMQ Classic guards deliveredMessages on both the receive add and the 
individual ack remove and serializes the wire send through MutexTransport, and 
the individual ack deletes exactly the one message id without touching the 
CLIENT_ACKNOWLEDGE counters, so ack and receiveNoWait do not race there. 
   2. Qpid serializes everything on its single provider thread. Artemis is 
gentle in this interleaving too.
   
   The JMS spec does treat the whole session as single threaded including 
acknowledge, so this seems provider tolerance rather than a spec guarantee. 
That is fine for the three auto detected providers, but for someone setting a 
custom code via `withIndividualAcknowledgeModeCode` it is not guaranteed. A one 
line javadoc caveat there could be worth it. 



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to