Camel升级后Saxon Xslt处理InputStreamCache遇Unexpected EOF异常
Camel 3.14升级至4.0.2后Saxon XSLT组件异常问题
我们将Camel从3.14版本升级至4.0.2版本后遇到异常:自3.17版本起Camel会自动启用Stream Caches,原Exchange输入类型为byte[],现变为InputStreamCache,使用Saxon Xslt组件转换XML数据时出现报错:net.sf.saxon.trans.XPathException: Error reported by XML parser: Unexpected EOF in prolog
该报错提示转换时输入为空,但实际上InputStreamCache并非空值。完整堆栈信息如下:
net.sf.saxon.trans.XPathException: Error reported by XML parser: Unexpected EOF in prolog at [row,col {unknown-source}]: [1,0] at net.sf.saxon.pull.StaxBridge.next(StaxBridge.java:205) at net.sf.saxon.pull.PullFilter.next(PullFilter.java:98) at net.sf.saxon.pull.PullPushTee.next(PullPushTee.java:73) at net.sf.saxon.pull.PullConsumer.consume(PullConsumer.java:42) at net.sf.saxon.pull.PullPushCopier.copy(PullPushCopier.java:44) at net.sf.saxon.pull.PullSource.deliver(PullSource.java:95) at net.sf.saxon.pull.ActiveStAXSource.deliver(ActiveStAXSource.java:61) at net.sf.saxon.event.Sender.send(Sender.java:104) at net.saxon.Controller.makeSourceTree(Controller.java:1306) at net.sf.saxon.s9api.XsltTransformer.transform(XsltTransformer.java:342) at net.sf.saxon.jaxp.TransformerImpl.transform(TransformerImpl.java:75) at org.apache.camel.component.xslt.XsltBuilder.process(XsltBuilder.java:123) at org.apache.camel.support.ProcessorEndpoint.onExchange(ProcessorEndpoint.java:93) at org.apache.camel.component.xslt.XsltEndpoint.onExchange(XsltEndpoint.java:120)
设置camelContext.setStreamCaching(false);恢复旧行为后一切正常。我们有以下疑问:
- 是否遗漏了Camel的相关配置项以解决该问题?
- 如何准确定位该异常的根本原因?
- 是否有示例或测试验证Saxon Xslt可与
InputStreamCache配合使用?
进一步排查发现,路由中提前执行了String body = exchange.getIn().getBody(String.class);,导致InputStreamCache的底层流位置被移至末尾,后续复制到StaxSource时无数据。使用String inBody = MessageHelper.extractBodyAsString(exchange.getIn());或MessageHelper.resetStreamCache(exchange.getIn());可缓解问题,但不确定这是否为InputStreamCache的预期工作方式,Camel相关文档说明较为简略。
内容的提问来源于stack exchange,提问作者Mathias Olausson
相关产品推荐
相关产品推荐

