【问题标题】:Camel pollEnrich and xml 'prettyPrint'骆驼 pollEnrich 和 xml 'prettyPrint'
【发布时间】: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&amp;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&amp;showStreams=true" />
</route>

...打算试试 org.apache.camel.processor.aggregate.GroupedExchangeAggregationStrategy,但我猜测 Camel 总是将 EOL 字符视为消息分隔符存在配置限制。

更新 #2 - 附加信息:
收到的 REST(GET) 响应(用 wget 测试)有空行和空字段——但没有回车 (^M)。我已经尝试了 http 和 http4 组件——结果相同。有一个领先的&lt;?xml version="1.0" encoding="UTF-8"?&gt;,但没有命名空间/样式信息。我还刚刚注意到制表符已用于 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


【解决方案1】:

...所以“答案”是这是日志组件的“showStreams”逻辑的明显限制(或错误)。我在 中实现了处理器,将来自 pollEnrich 的 Exchange 输出路由到那个 ,然后记录了内容,这与 wget 的输出完全匹配。

仅供参考:这是camel-paxlogging (2.12.0.redhat-610379) - 不确定对应的骆驼的底层版本,因为我的 maven 存储库中似乎没有 jboss-parent-2.12.0 pom - 这很奇怪,因为我还有其他的 jboss-parent poms——而且 red hat 文档似乎没有涉及到版本组合。

仅供参考#2:在相关说明中,当我使用 GroupedExchangeAggregationStrategy 时,它确实会产生 List&lt;Exchange&gt;,但它的行为实际上与 UseLatestAggregationStrategy 相同——即,“分组”会产生一个项目 @ 987654325@ 仅具有 pollEnrich 结果,其中 'latest' 生成一个独立的 Exchange 对象,该对象仅具有 pollEnrich 结果。在GroupedExchangeAggregationStrategy 或pollEnrich 中似乎有一个错误......但这很可能是我下一个堆栈帖子的主题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 2015-05-05
    • 2014-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    相关资源
    最近更新 更多