Apache Camel - 组件

Camel 提供了几个预构建的组件。

在本章中,我们将讨论 camel-core 模块中的一些重要组件。

Bean

Bean 组件将 bean 绑定到 Camel 消息交换。 创建端点的 URI 指定为 bean:beanID,其中 beanIDRegistry 中指定的 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");
   }
});

请注意如何使用 bean: 协议指定端点。 您可以选择指定要调用的 bean 方法; 在这种情况下,在计算 Endpoint 表达式时将调用名为 placeOrder 的方法。 MilkOrderMilkOrderProcessor Javabean 的 JNDI 名称,在代码片段的前两行中注册。 为了简洁起见,这里省略了 MilkOrderProcessor 本身的定义。

Direct

您一定已经注意到我们前面的示例中使用了Direct。 为了向石油供应商发送订单,我们在端点规范中使用了 direct:oil。 使用Direct组件允许您同步调用端点。 我们之前示例中的以下两个代码片段说明了 Direct 的用法 −

.when(header("order").isEqualTo("oil"))
   .to("direct:oil")

And,

from("direct:DistributeOrderDSL")
   .process(myProcessor);

File

File组件提供对计算机上文件系统的访问。 使用此组件,您将能够将来自其他组件的消息保存到本地磁盘。 此外,它还允许其他Camel组件处理本地文件。 使用文件组件时,您可以使用 file:directoryName[?options]file://directoryName[?options] 作为 URI 格式。 您之前已经看到过该组件的使用 −

from ("file:/order").to("jms:orderQueue");

请注意,File 组件默认采用目录名称。 order 目录的内容将作为输入内容。 要指定 order 目录中的特定文件,您将使用以下语句 −

from ("file:/order?fileName = order.xml").to("jms:orderQueue");

Log

Log 组件允许您将消息记录到底层日志记录机制中。 Camel 使用 Simple Logging Facade for Java (SLF4J) 作为各种日志框架的抽象。 您可以使用java.util.logging、logback、log4j进行日志记录。 此代码片段说明了 Log 组件的使用 −

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

Timer 组件用于定期发送消息,因此在测试 Camel 应用程序时非常有用。 这里的代码片段每两秒向控制台发出一条测试消息 −

from("timer://testTimer?period = 2000")
   .setBody()
   .simple("This is a test message ${header.timer}")
      .to("stream:out");