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

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


The following commit(s) were added to refs/heads/main by this push:
     new ae6ec8c5b6ca CAMEL-24078: camel-jms - Make 
JmsPollingConsumer.receive(timeout) thread-safe
ae6ec8c5b6ca is described below

commit ae6ec8c5b6ca8d61d78687e7c021777c878cae93
Author: Claus Ibsen <[email protected]>
AuthorDate: Wed Jul 15 18:07:50 2026 +0200

    CAMEL-24078: camel-jms - Make JmsPollingConsumer.receive(timeout) 
thread-safe
    
    Synchronize on the shared JmsTemplate to make set-timeout + receive
    atomic. The polling consumer is cached via ConsumerCache and shared
    across concurrent pollEnrich / ConsumerTemplate callers, so without
    synchronization one thread's timeout could be silently overwritten
    by another before the receive call executes.
    
    Closes #24738
    Co-Authored-By: Claude Opus 4.6 <[email protected]>
---
 .../apache/camel/component/jms/JmsPollingConsumer.java    | 15 +++++++++------
 1 file changed, 9 insertions(+), 6 deletions(-)

diff --git 
a/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsPollingConsumer.java
 
b/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsPollingConsumer.java
index a2755c5b981e..2e6eac1ee0ae 100644
--- 
a/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsPollingConsumer.java
+++ 
b/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsPollingConsumer.java
@@ -55,13 +55,16 @@ public class JmsPollingConsumer extends 
PollingConsumerSupport {
 
     @Override
     public Exchange receive(long timeout) {
-        setReceiveTimeout(timeout);
         Message message;
-        // using the selector
-        if (ObjectHelper.isNotEmpty(jmsEndpoint.getSelector())) {
-            message = template.receiveSelected(jmsEndpoint.getSelector());
-        } else {
-            message = template.receive();
+        // synchronize to make set-timeout + receive atomic, as the polling 
consumer
+        // may be shared across concurrent pollEnrich / ConsumerTemplate 
callers
+        synchronized (template) {
+            setReceiveTimeout(timeout);
+            if (ObjectHelper.isNotEmpty(jmsEndpoint.getSelector())) {
+                message = template.receiveSelected(jmsEndpoint.getSelector());
+            } else {
+                message = template.receive();
+            }
         }
         if (message != null) {
             return getEndpoint().createExchange(message, null);

Reply via email to