- Apache Camel 教程
- Apache Camel - 首页
- Apache Camel - 简介
- Apache Camel - 概述
- Apache Camel - 功能特性
- Apache Camel - 架构
- Apache Camel - CamelContext
- Apache Camel - 端点
- Apache Camel - 组件
- Apache Camel - 消息队列
- Apache Camel - 项目
- 使用 Spring 与 Camel
- Apache Camel 有用资源
- Apache Camel - 快速指南
- Apache Camel - 有用资源
- Apache Camel - 讨论
Apache Camel - CamelContext
CamelContext 提供了对 Camel 中所有其他服务的访问,如下图所示:
让我们看看各种服务。注册表模块默认情况下是 JNDI 注册表,它保存应用程序使用的各种 JavaBean 的名称。如果使用 Spring 与 Camel,则它将是 Spring ApplicationContext。如果在 OSGI 容器中使用 Camel,则它将是OSGI 注册表。类型转换器顾名思义,包含各种已加载的类型转换器,它们将输入从一种格式转换为另一种格式。您可以使用内置的类型转换器,也可以提供您自己的转换机制。组件模块包含应用程序使用的组件。组件通过您指定的类路径上的自动发现来加载。在 OSGI 容器的情况下,这些组件在激活新捆绑包时加载。我们已经在前面的章节中讨论了端点和路由。数据格式模块包含已加载的数据格式,最后语言模块表示已加载的语言。
此处的代码片段将让您了解如何在 Camel 应用程序中创建CamelContext:
CamelContext context = new DefaultCamelContext(); try { context.addRoutes(new RouteBuilder() { // Configure filters and routes } } );
DefaultCamelContext 类提供了CamelContext 的具体实现。在addRoutes 方法中,我们创建了RouteBuilder 的匿名实例。您可以创建多个RouteBuilder 实例来定义多个路由。同一上下文中的每个路由必须具有唯一的 ID。路由可以在运行时动态添加。具有与先前定义的路由相同的 ID 的路由将替换旧路由。
接下来将介绍RouteBuilder 实例中包含的内容。
路由
路由器定义了将消息从from 位置移动到to 位置的规则。您可以使用RouteBuilder 在 Java DSL 中定义路由。您可以通过扩展内置的RouteBuilder 类来创建路由。路由以from 端点开始,并在一个或多个 to 端点结束。在这两者之间,您实现处理逻辑。您可以在单个configure 方法中配置任意数量的路由。
这是一个关于如何创建路由的典型示例:
context.addRoutes(new RouteBuilder() { @Override public void configure() throws Exception { from("direct:DistributeOrderDSL") .to("stream:out"); } }
我们覆盖RouteBuilder 类的 configure 方法,并在其中实现我们的路由和过滤机制。在本例中,我们将从端点DistributeOrderDSL接收到的输入重定向到控制台,该控制台由端点stream:out指定。
语言选择
您可以使用不同的语言创建路由。以下是一些关于如何在三种不同语言中定义相同路由的示例:
Java DSL
from ("file:/order").to("jms:orderQueue");
Spring DSL
<route> <from uri = "file:/order"/> <to uri = "jms:orderQueue"/> </route>
Scala DSL
from "file:/order" -> "jms:orderQueue"
过滤器
您可以使用过滤器选择一部分输入内容。要设置过滤器,您可以使用任何任意的Predicate实现。然后将过滤后的输入发送到您所需的目的地端点。在这个例子中,我们过滤掉所有肥皂订单,以便可以将它们集体发送给肥皂供应商。
from("direct:DistributeOrderDSL") .split(xpath("//order[@product = 'soaps']/items")) .to("stream:out");
在这个例子中,我们使用了xpath谓词进行过滤。如果您想使用 Java 类进行过滤,请使用以下代码:
from("direct:DistributeOrderDSL") .filter() .method(new Order(),"filter") .to("stream:out");
Order 是您具有您自己的过滤机制的自定义 Java 类。
您可以将多个谓词组合在一个路由中,如下所示:
from("direct:DistributeOrderDSL") .choice() .when(header("order").isEqualTo("oil")) .to("direct:oil") .when(header("order").isEqualTo("milk")) .to("direct:milk") .otherwise() .to("direct:d");
因此,现在所有“油”订单将发送给油供应商,“牛奶”订单将发送给牛奶供应商,其余的将发送到公共池。
自定义处理器
您也可以使用自定义处理。下面的示例创建了一个名为myCustomProcessor的自定义处理器,并在路由构建器中使用它。
Processor myCustomProcessor = new Processor() { public void process(Exchange exchange) { // implement your custom processing } }; RouteBuilder builder = new RouteBuilder() { public void configure() { from("direct:DistributeOrderDSL") .process(myProcessor); } };
您可以将自定义处理器与选择和过滤结合使用,以更好地控制您的中介和路由:
from("direct:DistributeOrderDSL") .filter(header("order").isEqualTo("milk")) .process(myProcessor);
使用 XML
如果您愿意,可以使用更庞大的 XML 来定义路由。以下 XML 代码片段显示了如何通过 Spring XML 创建路由以及一些过滤:
<camelContext xmlns = "http://camel.apache.org/schema/spring"> <route> <from uri = "direct:DistributeOrderXML"/> <log message = "Split by Distribute Order"/> <split> <xpath>//order[@product = 'Oil']/items</xpath> <to uri = "file:src/main/resources/order/"/> <to uri = "stream:out"/> </split> </route> </camelContext>
了解了如何构建路由后,我们现在将了解创建端点的各种技术。