Federico Mariani created CAMEL-23982:
----------------------------------------
Summary: camel-yaml-dsl - shared bean cache cleared globally after
each configure() causes beans to be created twice when loading multiple YAML
files
Key: CAMEL-23982
URL: https://issues.apache.org/jira/browse/CAMEL-23982
Project: Camel
Issue Type: Bug
Components: camel-yaml-dsl
Affects Versions: 4.21.0
Reporter: Federico Mariani
{{BeansDeserializer}} keeps a {{beanCache}} ({{name:type}} keys) to avoid
creating beans twice: beans are created eagerly during pre-parse and the
{{beans}} node is constructed *again* during {{configure()}} (see comment at
{{BeansDeserializer.java:80-84}}). The deserializer instance is shared per
loader ({{YamlRoutesBuilderLoaderSupport.java:48}}), so the cache spans all
YAML resources.
The problem: {{YamlRoutesBuilderLoader}}'s {{configure()}} ends with a *global*
{{beansDeserializer.clearCache()}} ({{YamlRoutesBuilderLoader.java:174}}), but
{{DefaultRoutesLoader}} pre-parses *all* resources first
({{DefaultRoutesLoader.java:147-176}}) and only then are builders configured
one by one ({{RoutesConfigurer}}).
Failure scenario with two files {{a.yaml}} and {{b.yaml}}, each containing a
{{beans:}} block:
# pre-parse registers beans from both files and fills the cache;
# {{configure()}} for {{a.yaml}} correctly skips its beans as duplicates, then
calls {{clearCache()}} wiping *all* keys including {{b.yaml}}'s;
# {{configure()}} for {{b.yaml}} re-constructs its {{beans}} node, gets cache
misses, and *creates and rebinds every bean a second time* —
constructors/init-methods run twice, and the first instance is replaced in the
registry without its destroy-method being invoked (leaked resources, duplicated
side effects).
Fix: clear only the keys belonging to the resource being configured (or key the
cache per resource) instead of {{beanCache.clear()}}.
Related hardening in the same code path: the {{preparseDone.remove(...)}} +
{{clearCache()}} cleanup at {{YamlRoutesBuilderLoader.java:167-174}} is not in
a {{finally}} block, so an exception during {{configure()}} leaves stale
pre-parse state; on dev-mode reload of the corrected file, {{preParseRoute}}
short-circuits ({{:636-638}}) and edited {{beans}} definitions are silently not
re-parsed.
_Filed by Claude Code on behalf of Croway._
--
This message was sent by Atlassian Jira
(v8.20.10#820010)