2012-08-30 55 views
2

给定一个Camel路由,该路由应该提取XML消息的某些内部部分,然后从中创建一条新消息,然后将其传递。Apache Camel/xpath操作结果检测

from(SUB_EXTRACT_XML) 
    .setExchangePattern(ExchangePattern.InOut) 
    .setBody().xpath("//mmsg:MyMessage/mmsg:AnyPayload/*", namespaces) 
    .setBody().simple("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n${in.body}") 
    .to(...) 

对于(“嵌入” XML消息的内部架构中为xs定义:任何)这样的正确的输入信息,也因为消息的工作是什么,我希望它是:

<mmsg:MyMessage> 
    <mmsg:RandomTags/> 
    ... 
    <mmsg:AnyPayload> <!-- xs:any in xsd --> 
    <some><xml/><here/></some> 
    </mmsg:AnyPayload> 
</mmsg:MyMessage> 

鉴于存在一些问题,XML消息,如彩信网关:AnyPayload标签丢失,从而使XPATH不能做自己的工作:

<mmsg:MyMessage> 
    <mmsg:RandomTags/> 
    ... 
    <some><xml/><here/></some> 
</mmsg:MyMessage> 

的XPATH将无法提取数据和整个XML m消息(包括mmsg:MyMessage)被传递,这不是预期的。我宁愿在这个阶段抛出一些例外。

问:

有没有一种方法来检查,如果XPath表达式居然发现元素refered到后来的路线,或者如果它未能提取特定元素(S)?

我知道我可以在之前对消息进行一些模式验证并拒绝垃圾消息,但是有什么方法可以查看XPath表达式是否失败?

+0

你使用什么版本的骆驼? –

+0

2.9.2在具体情况下。如果有帮助,我们可以升级到2.10.1。 –

+0

是啊给2.9.3一个尝试。 –

回答

0

一种解决方案是使用choice() DSL在这样的路线:

from(SUB_EXTRACT_XML) 
    .setExchangePattern(ExchangePattern.InOut) 
    .choice() 
     .when(xpath("//mmsg:MyMessage/mmsg:AnyPayload", namespaces)) 
      .setHeader("Status", "OK") // just for another example how to transmit some variable between two routes 
      .setBody().simple("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n${in.body}") 
      .endChoice() 
     .otherwise() 
      .log(LoggingLevel.ERROR, "LoggerName", "Error message; Stop the processing") 
      .stop() 
     .endChoice() 
    .end() 
    // Just to show the headers are following the route... 
    .to("DIRECT_GO_FORWARD"); 



from("DIRECT_GO_FORWARD") 
    .setExchangePattern(ExchangePattern.InOut) 
    .choice() 
     .when(header("Status").isEqualTo("OK")) 
      .bean(new SampleProcessor()) 

     ... 
    .end() 
    ... 
    .to("..."); 

第二条路线是只是为了显示你可以使用标头在第一路设置(与体内过多) 。