You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@camel.apache.org by "Claus Ibsen (Jira)" <ji...@apache.org> on 2026/07/11 08:21:00 UTC

[jira] [Assigned] (CAMEL-23982) camel-yaml-dsl - shared bean cache cleared globally after each configure() causes beans to be created twice when loading multiple YAML files

     [ https://issues.apache.org/jira/browse/CAMEL-23982?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Claus Ibsen reassigned CAMEL-23982:
-----------------------------------

    Assignee: Claus Ibsen

> 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
>            Assignee: Claus Ibsen
>            Priority: Major
>
> {{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)