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

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

commit 0943391491b78822e391cc6c8151d059babf46a0
Author: Claus Ibsen <[email protected]>
AuthorDate: Thu Jul 16 10:01:42 2026 +0200

    CAMEL-24104: camel-bean - Fix racy Processor-adapter lookup in 
AbstractBeanProcessor
    
    Co-Authored-By: Claude Opus 4.6 <[email protected]>
    Signed-off-by: Claus Ibsen <[email protected]>
---
 .../camel/component/bean/AbstractBeanProcessor.java     | 17 +++++++++++------
 1 file changed, 11 insertions(+), 6 deletions(-)

diff --git 
a/components/camel-bean/src/main/java/org/apache/camel/component/bean/AbstractBeanProcessor.java
 
b/components/camel-bean/src/main/java/org/apache/camel/component/bean/AbstractBeanProcessor.java
index 429276340ca5..92412328f379 100644
--- 
a/components/camel-bean/src/main/java/org/apache/camel/component/bean/AbstractBeanProcessor.java
+++ 
b/components/camel-bean/src/main/java/org/apache/camel/component/bean/AbstractBeanProcessor.java
@@ -37,9 +37,9 @@ public abstract class AbstractBeanProcessor extends 
AsyncProcessorSupport {
     private static final Logger LOG = 
LoggerFactory.getLogger(AbstractBeanProcessor.class);
 
     private final BeanHolder beanHolder;
-    private transient Processor processor;
+    private transient volatile Processor processor;
     private transient Object bean;
-    private transient boolean lookupProcessorDone;
+    private transient volatile boolean lookupProcessorDone;
     private final Lock lock = new ReentrantLock();
     private BeanScope scope;
     private String method;
@@ -130,10 +130,15 @@ public abstract class AbstractBeanProcessor extends 
AsyncProcessorSupport {
                 if (!lookupProcessorDone) {
                     lock.lock();
                     try {
-                        lookupProcessorDone = true;
-                        // so if there is a custom type converter for the bean 
to processor
-                        target = 
exchange.getContext().getTypeConverter().tryConvertTo(Processor.class, 
exchange, beanTmp);
-                        processor = target;
+                        if (!lookupProcessorDone) {
+                            // so if there is a custom type converter for the 
bean to processor
+                            target = 
exchange.getContext().getTypeConverter().tryConvertTo(Processor.class, exchange,
+                                    beanTmp);
+                            processor = target;
+                            lookupProcessorDone = true;
+                        } else {
+                            target = processor;
+                        }
                     } finally {
                         lock.unlock();
                     }

Reply via email to