我有一个Camel路由需要从FTP接收XML文件作为流,验证并拆分它 .
一切工作都很好,一直到验证,但然后拆分不能按预期工作 . 在调试时,我发现当原始消息是流时,拆分过程找不到任何处理器 . 它看起来非常像我的错误 .
from("direct:start")
.pollEnrich("ftp://user@host:21?fileName=file.xml&streamDownload=true&password=xxxx&fastExistsCheck=true&soTimeout=300000&disconnect=true")
.to("validator:myXsd.xsd")
.split().tokenizeXML("myTag")
.to(to)
.end();
在这种情况下,我可以看到Exchange进入拆分器,但没有找到处理器,拆分什么也没做 . 如果我删除验证,行为是不同的:
from("direct:start")
.pollEnrich("ftp://user@host:21?fileName=file.xml&streamDownload=true&password=xxxx&fastExistsCheck=true&soTimeout=300000&disconnect=true")
.split().tokenizeXML("myTag")
.to(to)
.end();
在这种情况下,分离器工作正常 .
此外,如果XML文件不是来自流,那么一切都很好 .
from("file:file.xml")
.to("validator:myXsd.xsd")
.split().tokenizeXML("myTag")
.to(to)
.end();
我将我的Camel版本更新为2.15.2但仍然得到相同的错误 .
2 回答
我不知道验证器是如何工作的,但如果正在更改消息体,请尝试将其存储为标头或属性,例如:
.setHeader("headerName",simple("${body}"))
并在验证器.setBody(simple("${header.headerName}"))
之后我试图传递一个流体的问题 . (streamDownload =真) . 验证器将读取流并验证内容 . 没问题 .
但问题出现在分裂到来时,流已经被读取和关闭 . 因此拆分不能对流做任何事情 .
我已经在没有流的情况下解决了这个问题,但我想如果需要一个流,那么使用流式缓存也会有效 .
见http://camel.apache.org/why-is-my-message-body-empty.html