📜  Apache Camel-CamelContext

📅  最后修改于: 2020-10-30 10:04:26             🧑  作者: Mango


CamelContext提供对Camel中所有其他服务的访问,如下图所示-

骆驼语境

让我们看看各种服务。默认情况下, Registry模块是JNDI注册表,其中包含应用程序使用的各种Javabean的名称。如果将Camel与Spring一起使用,则为Spring ApplicationContext 。如果在OSGI容器中使用骆驼,这将是OSGI注册表。顾名思义,类型转换器包含各种已加载的类型转换器,可将您的输入从一种格式转换为另一种格式。您可以使用内置的类型转换器,也可以提供自己的转换机制。组件模块包含您的应用程序使用的组件。通过自动发现将组件加载到您指定的类路径上。如果是OSGI容器,则每当激活了新的捆绑软件时便会加载它们。我们已经在前面的章节中讨论了端点路由数据格式模块包含已加载的数据格式,最后语言模块代表已加载的语言。

此处的代码段将使您了解如何在Camel应用程序中创建CamelContext-

CamelContext context = new DefaultCamelContext();
try {
   context.addRoutes(new RouteBuilder() {
      // Configure filters and routes
   }
}
);

DefaultCamelContext类提供CamelContext的具体实现。在addRoutes方法中,我们创建一个RouteBuilder的匿名实例。您可以创建多个RouteBuilder实例来定义多个路由。同一上下文中的每个路由必须具有唯一的ID。可以在运行时动态添加路由。 ID与先前定义的ID相同的路由将替换旧路由。

接下来介绍RouteBuilder实例中的内容。

路线

路由器定义了将消息移到位置的规则。您可以使用RouteBuilder在Java DSL中定义路由。通过扩展内置的RouteBuilder类来创建路由。这条路线与开始终点,并完成一个或多个到端点。在这两者之间,您将实现处理逻辑。您可以在一种配置方法中配置任意数量的路由。

这是如何创建路由的典型示例-

context.addRoutes(new RouteBuilder() {
   @Override
   public void configure() throws Exception {
      from("direct:DistributeOrderDSL")
      .to("stream:out");
   }
}

我们重写RouteBuilder类的configure方法,并在其中实现路由和过滤机制。在当前情况下,我们将从Endpoint DistributeOrderDSL接收到的输入重定向到由Endpoint stream:out指定的控制台。

语言选择

您可以使用其他语言创建路线。以下是一些示例,说明了如何使用三种不同的语言定义相同的路线-

Java DSL

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

春季DSL


   
   

Scala DSL

from "file:/order" -> "jms:orderQueue"

筛选器

您使用过滤器选择输入内容的一部分。要设置过滤器,请使用任意的谓词实现。然后,已过滤的输入将发送到所需的目标端点。在此示例中,我们筛选出所有肥皂订单,以便将这些订单一起发送给肥皂供应商。

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创建路由以及进行一些过滤-


   
      
      
      
         //order[@product = 'Oil']/items
         
         
      
   

了解了路线的构建方式之后,我们现在将了解创建端点的各种技术。