背景
camel
已经具备了通过多种方式(在camel中称为language
)访问exchange的header、property和body,比如
bean,constant,simple,xpath,jxpath,ognl,mvel,scripting等。这些方式可以很容易地操作exchange的内容。如果exchange中包含的内容是一个sdo实例,也就是一个DataObject,那么camel如何去操作它呢?根据我们的理解,DataObject也是一个JavaBean,因为jxpath
可以直接处理JavaBean,除此之外jxpath还可以处理Map,DOM,Servlet等,所以使用jxpath不就可以操作sdo了吗?
实例分析
下面是截取的部分exchange的内容,可以看到它的BodyType和Body。
Headers:{JMSTimestamp=1258701583453, JMSDeliveryMode=1, JMSMessageID=ID:honnom-1258701582234-0:0:1:2:1, JMSXGroupID=null,
JMSPriority=4, JMSType=null, JMSCorrelationID=null, JMSDestination=queue://in, JMSRedelivered=false, JMSReplyTo=null, JMSExpiration=0},
BodyType:com.honnom.sdo.impl.DataObjectImpl, Body:<supermarketType __type="sdo:http://www.example.com/supermarket#supermarketType" __id="0">
<Name __type="java:java.lang.String">NGS</Name><Address __type="sdo:http://www.example.com/supermarket#addressType" __id="2">
<Street __type="java:java.lang.String">ZhangJiang</Street><City __type="java:java.lang.String">ShangHai</City>
<State __type="java:java.lang.String">China</State><Zip __type="java:java.lang.String">201204</Zip></Address>
<Customer __type="sdo:http://www.example.com/supermarket#customerType" __collection="list" __collectionid="1" __id="3" __index="0">
<Name __type="java:java.lang.String">Tom</Name><Gender __type="java:java.lang.String">Man</Gender><Age __type="java:java.lang.String">15</Age>
<Fee/></Customer><Customer __type="sdo:http://www.example.com/supermarket#customerType" __collection="list" __collectionid="1" __id="4" __index="1">
<Name __type="java:java.lang.String">Jim</Name><Gender __type="java:java.lang.String">Man</Gender><Age __type="java:java.lang.String">25
</Age><Fee/></Customer><Customer __type="sdo:http://www.example.com/supermarket#customerType" __collection="list"
__collectionid="1" __id="5" __index="2"><Name __type="java:java.lang.String">Jessica</Name><Gender __type="java:java.lang.String">Woman</Gender>
<Age __type="java:java.lang.String">15</Age>
<Fee/></Customer></supermarketType>
配置camle-config.xml的路由规则:<when><jxpath>in/body/Customer[3]/Age <= 16</jxpath><to uri="jms:queue:honnom" /></when>
。这个规则的意思是如果该exchange的body内容中的Customer[3]的Age的值小于或等于16,那么会将该exchage发送到队列honnom。
运行结果是队列honnom上没有接收到任何消息,也就是说jxpath认为该消息不符合该表达式,但从exchange的Body可以看到Customer[3]的Age值为15,小于16
,应该是符合jxpath表达式的。所以jxpath不能正确的路由sdo。
解决方案
为了解决这个问题,必须实现一个新的组件来支持对sdo的解析,在此命名为camle-sxpath。实现该组件的主要内容包括如下。
1.在camel-config.xml中新增<expath>
元素。<expath>
表示将使用camle-sxpath解析exchange。
2.实现EXPathLanguage.java,支持expression和predicate。
3.实现EXPathExpression.java,支持对expression和predicate的evaluate。
4.在SDL中支持expath()方法。
实现效果
将上文提到的路由规则修改为<when><expath>in/body/Customer[3]/Age <= 16</expath><to uri="jms:queue:honnom" /></when>
即可。可以在队列honnom上接收到该消息,说明对camle-sxpath的实现初步完成。
分享到:
相关推荐
- Camel 提供了强大的测试支持,使开发者能够在开发过程中进行充分的单元测试和集成测试。 **2. 错误处理** - Camel 包含了一整套错误处理机制,帮助开发者在遇到异常情况时优雅地处理错误,确保系统的稳定性和...
Camel 打破了传统模式,它支持 80 多种不同的协议和数据类型,它的扩展性和模块性允许你实现你自己专有协议的无缝插件。 1.2.1 为什么使用 Camel Camel 为整합领域介绍了一些新奇的观点,这就是为什么它的作者们...
Apache Camel 是一个强大的开源框架,专门用于构建企业级应用程序中的集成解决方案。它提供了一种声明式的方式来进行...在实践中,结合具体的业务场景和需求,灵活运用Camel的特性,将使应用程序更加健壮和易于扩展。
4. **可扩展性:** 开发者可以根据需要扩展 Camel 的功能,比如创建自定义的组件或处理器。 5. **异步处理:** Camel 支持非阻塞的消息处理模式,有助于提高系统的吞吐量和响应速度。 6. **容错与重试机制:** Camel...
- **定义**:Apache Camel 是一个强大的开源框架,它使开发者能够轻松地实现企业级集成模式(Enterprise Integration Patterns, EIP)。该框架提供了简洁而强大的领域特定语言(Domain-Specific Language, DSL),...
Apache Camel 的 JDBC 组件就是将这两个强大的工具结合在一起,使开发者能够方便地在Camel路由中执行SQL查询和操作数据库。 在"Apache Camel-JDBC"这个主题中,我们可以深入探讨以下几个关键知识点: 1. **Apache ...
7. **分布式系统集成**:Camel的异步处理和负载均衡特性使其在分布式系统中表现出色。配合Camel的云组件,可以轻松实现微服务之间的通信。 8. **事件驱动架构**:Apache Camel可以通过事件驱动的方式工作,结合消息...
matlab的6驼峰功能的实现六驼峰CAMEL功能说明:外形尺寸:2左边的图显示了在其推荐的输入域的六驼峰骆驼功能,并且在右边的图显示了该结构域的仅一部分,以允许更容易地观看的功能键的特性。该函数有六个地方很小,...
- **扩展策略**:讨论如何根据业务需求来扩展Camel应用,以支持更大的负载。 - **第11章:开发Camel项目** - **项目结构**:介绍如何组织Camel项目的结构,以便于维护和扩展。 - **开发工具**:推荐一些常用的...
Camel6函数则是扩展了三峰骆驼函数,增加了一个额外的峰,使其具有四个局部极值点,增加了寻找全局最小值的难度。其数学形式可能为: ``` f(x) = a * (x^2 - b*x)^4 + c * (x^2 - d*x)^2 + e ``` 这里,`a`, `b`, ...
Apache Camel是一个基于已知企业集成模式的多功能开源集成框架。它提供了一种灵活的方式来定义路由和调解规则,支持多种特定领域的语言,包括基于Java的Fluent API、Spring或Blueprint XML配置文件以及Scala DSL。这...
总的来说,Apache Camel FTP 组件是构建基于文件传输的集成解决方案的强大工具,通过其丰富的功能和易于使用的 API,能够简化开发工作,提升系统的可维护性和扩展性。结合提供的示例,你可以深入学习并掌握如何在...
9. **扩展性和灵活性**:Apache Camel 的设计允许用户轻松添加自定义组件或扩展已有组件,适应各种特定需求。 在压缩包文件“apache-camel-3.7.0”中,可能包含了Apache Camel 3.7.0版本的完整源码、文档、示例项目...
其基于企业集成模式的设计理念,结合对多种传输层和消息模型的支持,以及与主流框架的无缝集成,使其成为开发高效、可扩展的集成系统时的理想选择。此外,其丰富的测试支持和详尽的文档资源,为开发者提供了全面的...
Apache Camel是一款流行的开源项目,它提供了一种声明式的方式来进行企业应用集成。该框架的核心概念是“路由规则”(Routes),这些规则定义了数据流如何在不同系统间传输。Camel支持大量协议和API,包括HTTP、JMS...
领域特定语言意味着Apache Camel支持你在的集成开发工具中使用平常的,类型安全的,可自动补全的Java代码来编写路由规则,而不需要大量的XML配置文件。同时,也支持在Spring中使用XML配置定义路由和中介规则。 在...
- 探讨Bean的生命周期管理以及如何利用Beans来扩展Camel的功能。 - **第五章:Error Handling**(错误处理) - 提供详细的错误处理策略,以确保系统的稳定性和可靠性。 - 探讨异常处理机制、重试策略等。 - **第...
3. **灵活且可扩展**:用户可以轻松地扩展Camel的功能,以适应各种不同的应用场景。 4. **广泛的组件支持**:Camel内置了大量组件,可以与各种不同的技术栈进行无缝集成。 5. **强大的社区支持**:活跃的社区确保了...
《Manning.Camel.in.Action》一书由Claus Ibsen和Jonathan Anstey共同撰写,是Manning Publications出版的一部深入探讨...通过本书的学习,你将能够充分利用Camel的强大功能,构建出高效、可扩展的企业级集成解决方案。
Apache Camel是一个流行的开源Java库,它提供了强大的路由和消息转换功能,使得在分布式系统中处理数据和实现组件间的通信变得更加简单。 本书深入浅出地介绍了Camel的核心概念,包括路由规则(DSL)、组件、数据...