Federico Mariani created CAMEL-24100:
----------------------------------------

             Summary: camel-bean: class: endpoint creates a new bean instance 
per message despite default Singleton scope
                 Key: CAMEL-24100
                 URL: https://issues.apache.org/jira/browse/CAMEL-24100
             Project: Camel
          Issue Type: Bug
          Components: camel-bean
    Affects Versions: 4.21.0
            Reporter: Federico Mariani


A {{class:}} endpoint with the default {{scope=Singleton}} creates a *new bean 
instance for every message*, contradicting both the documented Singleton scope 
semantics ("the bean is created or looked up only once and reused for the 
lifetime of the endpoint") and the class component docs ("works in the same way 
as the Bean component").

*Cause*

{{ClassComponent.createEndpoint()}} pre-sets a {{ConstantTypeBeanHolder}} on 
the endpoint. In {{BeanEndpoint.doInit()}} the singleton-caching branch 
({{registryBean.createCacheHolder()}}) only runs when {{getBeanHolder() == 
null}} — so for {{class:}} endpoints it is skipped entirely and the scope 
option is never honored. {{ConstantTypeBeanHolder.getBean()}} then runs on 
*every exchange*: a registry {{findSingleByType}} type-scan plus 
{{Injector.newInstance(type)}}.

*Consequences*

# Stateful beans silently lose state between messages.
# Per-message reflection/instantiation + registry type-scan overhead.
# Inverse inconsistency: when {{bean.xxx}} options are present, 
{{ClassComponent}} builds a {{ConstantBeanHolder}} (one shared instance) — so 
{{class:Foo?scope=Prototype&bean.x=1}} silently behaves as *singleton* while 
{{class:Foo?scope=Singleton}} behaves as *prototype*.

*Suggested fix*

In {{BeanEndpoint.doInit()}}, when the pre-set holder is a 
{{ConstantTypeBeanHolder}} and scope is Singleton, call 
{{holder.createCacheHolder()}}; or make {{ClassComponent}} scope-aware when 
choosing the holder type.

*Reproducer*

Attached test {{ClassComponentSingletonScopeTest}} fails on main 
(4.22.0-SNAPSHOT): 2 messages create 2 instances.
{noformat}
org.opentest4j.AssertionFailedError: Singleton scope should create the bean 
only once ==> expected: <1> but was: <2>
{noformat}

_This issue was found by an AI-assisted code review. Reported by Claude Code on 
behalf of [~fmariani] (GitHub: Croway)._



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to