认识学习Apache Camel及其重要组件

1,059 阅读4分钟

什么是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组件。