You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@camel.apache.org by "Federico Mariani (Jira)" <ji...@apache.org> on 2026/07/15 14:07:00 UTC
[jira] [Created] (CAMEL-24100) camel-bean: class: endpoint creates a new bean instance per message despite default Singleton scope
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)