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

davsclaus pushed a commit to branch fix/CAMEL-24078-m2
in repository https://gitbox.apache.org/repos/asf/camel.git

commit b6c0c7589fdb00bac95e3c9c59450257e306a2d2
Author: Claus Ibsen <[email protected]>
AuthorDate: Wed Jul 15 17:03:41 2026 +0200

    CAMEL-24078: camel-jms - Make JmsPollingConsumer.receive(timeout) 
thread-safe
    
    Synchronize on the JmsTemplate to make set-timeout + receive atomic.
    The polling consumer is cached and shared across concurrent pollEnrich
    and ConsumerTemplate callers, so unsynchronized access could cause one
    thread's timeout to be silently overwritten by another.
    
    Co-Authored-By: Claude Opus 4.6 <[email protected]>
    Signed-off-by: Claus Ibsen <[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