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/09/11 08:30:00 UTC

[jira] [Work started] (CAMEL-24684) camel-groovy - groovyXml creates a new XmlParser per unmarshal and writes one fragment at a time on marshal

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

Work on CAMEL-24684 started by Federico Mariani.
------------------------------------------------
> camel-groovy - groovyXml creates a new XmlParser per unmarshal and writes one fragment at a time on marshal
> -----------------------------------------------------------------------------------------------------------
>
>                 Key: CAMEL-24684
>                 URL: https://issues.apache.org/jira/browse/CAMEL-24684
>             Project: Camel
>          Issue Type: Improvement
>          Components: camel-groovy
>    Affects Versions: 4.22.0
>            Reporter: Federico Mariani
>            Assignee: Federico Mariani
>            Priority: Major
>
> Unmarshal: {{GroovyXmlDataFormat.unmarshal}} does {{new XmlParser()}} on every call. Groovy's constructor looks the {{SAXParserFactory}} up on the class path and sets its features, and the JDK builds a throwaway parser for every {{setFeature}}: for a 1 KB document that is 61% of the CPU and 64% of the bytes (33.2 us and 66 KB per parse; a reused factory measured 18.3 us).
> Marshal: {{printLines}} calls {{String.getBytes()}} and {{os.write()}} once per fragment (platform charset) and runs the {{TypeConverter}} on every value; 2.5-3x jacksonXml and 4-5x the bytes, and 28-34x slower on an unbuffered stream (252 us for 1 KB, 261 ms for 1 MB).
> Proposed fix (implemented and benchmarked): one configured {{SAXParserFactory}} per data format with exactly the features Groovy 5.1.2 sets ({{setNamespaceAware(true)}}, {{setValidating(false)}}, {{FEATURE_SECURE_PROCESSING}}, {{disallow-doctype-decl}}) and a {{SAXParser}} per thread wrapped by a cheap {{new XmlParser(saxParser)}} per call; the document rendered in memory and written once with the exchange charset; no {{TypeConverter}} call for String/Number/Boolean values. A DOCTYPE/XXE document is still rejected with the same {{SAXParseException}}; marshal output is byte-identical to the previous output.
> With the fix: 1 KB unmarshal 33.2 -> 10.8 us (3.1x), marshal 1.1-1.2x, unbuffered stream 33x. 1 MB unmarshal unchanged (the parse dominates).
> Related: CAMEL-22361 (original groovy-xml), design/security.adoc (XML parser features).
> ----
> _Found during a benchmark review of camel-groovy and the other scripting languages (camel-performance-tests branch camel-groovy-perf, tests/camel-jmh/groovy-results, JMH 1.37, JDK 21, one M1 Pro laptop). A candidate fix with tests exists on the local apache/camel branch camel-perf-all-fixes; a PR follows._
> _Claude Code on behalf of Croway_



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