【发布时间】:2015-08-08 15:25:36
【问题描述】:
我正在尝试使用 Camel 的 pollEnrich 功能,但它的行为如我所愿...我不是说它坏了,而是想知道是否有办法获得这种行为我渴望。也就是说,我有一个 XML(蓝图)定义的路由,如下所示:
<route>
<from uri="direct:a" />
<pollEnrich uri="http:www.somewebsite.com?format=application/xml" />
<to uri="log:com.acme?level=WARN&showStreams=true" />
</route>
现在,响应通常会很好地返回(例如,在网络浏览器中)。 问题 似乎不只是在一行上,出于某种原因,Camel 读取每一行,依次进入同一个缓冲区,从字符零开始......所以我们最终得到的是pollEnrich 的输出中有一条凌乱的行。也就是说,to uri="log... 行打印如下消息:
2015-05-26 13:55:26,379 | WARN | a.distr.topic.B] | contentEnrich |
? ? | 142 - org.apache.camel.camel-core - 2.12.0.redhat-610379 |
Exchange[ExchangePattern: InOnly, BodyType:
org.apache.camel.converter.stream.InputStreamCache, Body:
<?xml versi</ElementStatus> ]pe></Status>nd>gin>ys for this element.</Reason>>ame>
(强调最后一行垂直偏移)
我似乎无法找到一种方法来告诉 Camel 结果将采用“prettPrint”格式...有人知道吗?该文档似乎表明此选项不存在-在这种情况下,我认为这是一个错误...尽管我想有人可能会争辩说应该使用自定义聚合策略(我不同意和那个人一起,引用这个案例的简单性):)
更新#1:即使使用 org.apache.camel.processor.aggregate.UseLatestAggregationStrategy 也会产生相同的效果。 (即,用法如下)
<bean id="latestStrat"
class="org.apache.camel.processor.aggregate.UseLatestAggregationStrategy" />
<route>
<from uri="direct:a" />
<pollEnrich uri="http:www.somewebsite.com?format=application/xml" strategyRef="latestStrat" />
<to uri="log:com.acme?level=WARN&showStreams=true" />
</route>
...打算试试 org.apache.camel.processor.aggregate.GroupedExchangeAggregationStrategy,但我猜测 Camel 总是将 EOL 字符视为消息分隔符存在配置限制。
更新 #2 - 附加信息:
收到的 REST(GET) 响应(用 wget 测试)有空行和空字段——但没有回车 (^M)。我已经尝试了 http 和 http4 组件——结果相同。有一个领先的<?xml version="1.0" encoding="UTF-8"?>,但没有命名空间/样式信息。我还刚刚注意到制表符已用于 pretty-ish 缩进。总之,响应如下所示:
<?xml version="1.0" encoding="UTF-8"?><ElementStatus>
<Flag>false</Flag>
<CODE>XYZ</CODE>
<Locale>Western</Locale>
...
(同样,空格缩进是用制表符完成的——空行也有几个制表符)
【问题讨论】:
-
您可能被浏览器愚弄了,它重新格式化了 XML 响应并显示它打印给人类。使用可以转储 HTTP 服务器响应的低级工具,它应该是 Camel 逐字节读取的。
-
@ClausIbsen 不幸的是,并非如此。响应采用 pretty print-ish 格式——有几个特点:1. 有空行,2. 有没有值的
标签。不认为这两个应该是一个问题。
标签: apache-camel