什么是Apache Camel
Apache Camel是一个开源的集成框架,旨在使集成系统变得简单和容易。它允许终端用户使用相同的API集成各种系统,提供对多种协议和数据类型的支持,同时具有可扩展性,允许引入自定义协议。
特定领域的语言
路由和路由引擎是Camel的核心部分。路由包含了不同系统之间集成的流程和逻辑。
为了更容易、更简洁地定义路由,Camel为Java或Groovy等编程语言提供了几种不同的特定领域语言(DSL)。另一方面,它也提供了用Spring DSL在XML中定义路由的功能。
使用Java DSL或Spring DSL主要是用户的偏好,因为两者都有大部分的功能。Java DSL提供了Spring DSL不支持的一些功能。然而,Spring DSL有时更有利,因为可以改变XML而不需要重新编译代码。
应用集成的四种方法
有四种应用集成方法,每种方法都比其他方法更能解决一些集成准则。这四种集成方法包括文件传输、共享数据库、消息传递和远程过程调用。下面是对每一种方法的简要解释。
- 文件传输。一个应用程序产生共享数据的文件,供其他应用程序使用,反之亦然。
- 共享数据库。应用程序可以将它们希望共享的数据存储在一个共同的数据库中。
- 消息传递。一个应用程序连接到一个共享的信息传递系统,交换数据,并使用信息调用行为。
- 远程程序调用。一个应用程序公开它的API,这样它们就可以被其他应用程序远程调用,以运行其行为和交换数据。
Apache Camel的组件
在这里我们将讨论Apache Camel的几个重要组件,这些组件来自camel-core模块。
Bean
Bean组件将Bean绑定到Camel消息交换上。创建端点的URI被指定为bean:beanID,其中beanID是注册表中指定的bean的名称。
JndiContext jndiContext = new JndiContext();
jndiContext.bind("MilkOrder", new MilkOrderProcessor());
CamelContext camelContext = new DefaultCamelContext(jndiContext);
camelContext.addRoutes(new RouteBuilder() {
public void configure() {
from("direct:bigBasket")
.to("bean:MilkOrder?method=placeOrder");
}
});
直接
你一定注意到在我们之前的例子中使用了Direct。为了向一个石油供应商发送一个订单,我们在Endpoint规范中使用了direct:oil。使用Direct组件允许你同步地调用一个端点。下面是我们以前的例子中的两个代码片断,说明了Direct的使用------。
.when(header("order").isEqualTo("oil")) .to("direct:oil")
和:
from("direct:DistributeOrderDSL")
.process(myProcessor);
文件
File组件提供对你机器上的文件系统的访问。使用这个组件,你将能够把其他组件的信息保存到本地磁盘。此外,它允许其他Camel组件处理本地文件。在使用文件组件时,你可以使用**file:directoryName[?options]或file://directoryName[?options]**作为URI格式。
from ("file:/order").to("jms:orderQueue");
请注意,文件组件默认使用目录名。因此,订单目录的内容将被作为输入内容。
from ("file:/order?fileName = order.xml").to("jms:orderQueue");
日志
Log组件允许你将消息记录到底层的日志机制。Camel使用Simple Logging Facade for Java(SLF4J)作为各种日志框架的抽象。你可以使用java.util.logging, logback, log4j进行记录。
from("direct:DistributeOrderDSL")
.to("bean:MilkOrder?method = placeOrder")
.to("log:com.example.com?level = INFO&showBody = true");
SEDA
SEDA组件允许你在同一个CamelContext中异步调用另一个端点。如果你想跨CamelContext实例进行调用,你需要使用VM组件。这里说明了SEDA的使用----。
from("direct:DistributeOrderDSL")
// send it to the seda queue that is async
.to("seda:nextOrder")
在这个路由中,我们将简单地把订单路由到NextOrder异步队列。订阅了这个队列的客户端将从这个队列中获取消息。
计时器
Timer组件用于定期发送消息,因此在测试Camel应用程序时非常有用。这里的代码片段每两秒钟向控制台发送一条测试消息。
from("timer://testTimer?period = 2000")
.setBody()
.simple("This is a test message ${header.timer}")
.to("stream:out");
总结
ApacheCamel是一个优秀的框架,可以将应用程序与不同的技术和协议整合起来。最好的部分--除了对各种技术的特殊支持--是我们可以一直使用相同的概念。在本教程中,我们学习了如何处理不同的Apache camel组件。
