这是用户在 2024-3-28 21:52 为 https://camel.apache.org/manual/camelcontext.html 保存的双语快照页面,由 沉浸式翻译 提供双语支持。了解如何保存?

CamelContext


CamelContext 是运行时系统,汇集了 Apache Camel 的所有基本概念(路由、端点、组件等)。


该上下文对象代表 Camel 运行时系统。通常情况下,一个应用程序中只有一个 CamelContext 实例。

image


CamelContext 可以访问许多功能和服务,其中最显著的是组件、类型转换器、注册表、端点、路由、数据格式和语言。


下表列出了 CamelContext 提供的最常见服务:

 服务  说明

 组件


包含所使用的组件。

 终点


包含已使用的端点。

 路线

 使用中的路线

 数据格式


包含已加载的数据格式。

 语言


包含已加载的语言。

 类型转换器


包含已加载的类型转换器。Camel 有一种机制,允许您手动或自动将一种类型转换为另一种类型。

 登记处


包含一个注册表,允许您查找豆子。

 骆驼语境 101


为了让您更好地了解 Apache Camel,我们将讨论 CamelContext 中的内容。.

 路由引擎


Camel 的路由引擎在引擎盖下移动消息,并完成所有繁重的工作,以确保消息正确路由。它不会向开发者公开,但你应该知道它的存在。

 路线


路由是 Camel 的核心抽象。定义路由的最简单方法是将其定义为处理器链。在消息应用程序中使用路由器有很多原因。例如,通过将客户端与服务器、生产者与消费者分离,路由器可以实现以下功能:


  • 动态决定客户端将调用哪个服务器


  • 提供增加额外处理的灵活方式


  • 允许客户端和服务器独立开发


  • 通过连接能做好一件事的不同系统,促进更好的设计实践


  • 允许为测试目的将服务器的客户端存根化(使用模拟


Camel 中的每个路由都有一个唯一的标识符。你可以使用标识符来记录、调试、监控、启动和停止路由。


路由只有一个信息输入源。它们实际上与一个输入端点绑定。


特定域语言(DSL)


为了将处理器和端点连接起来形成路由,Camel 定义了 DSL。


在使用 Java 的 Camel 中,DSL 指的是包含以 EIP 术语命名的方法的流畅 Java API。

 请看这个例子:

from("file:data/inbox")
    .filter().xpath("/order[not(@test)]")
        .to("jms:queue:order");


在这里,你只需在一条 Java 语句中定义一个路由,该路由从文件端点消耗文件。Camel 使用 "过滤器 EIP "来路由消息,使用 XPath 谓词来测试消息是否不是测试订单。如果消息通过了测试,Camel 就会将其转发到 JMS 端点。未通过过滤测试的消息将被跳过。


Camel 提供多种 DSL 语言。您可以使用 XML DSL 定义相同的路由:

<route>
    <from uri="file:data/inbox"/>
    <filter>
        <xpath>/order[not(@test)]</xpath>
        <to uri="jms:queue:order"/>
    </filter>
</route>

 而在 YAML 中:

- from:
    uri: "file:data/inbox"
    steps:
      - filter:
          xpath: "/order[not(@test)]"
          steps:
            - to: "jms:queue:order"


DSL 为 Camel 用户构建应用程序提供了一个很好的抽象。不过,在引擎盖下,路由是由处理器图组成的。

 处理器


处理器是一个核心的 Camel 概念,代表一个能够使用、创建或修改传入交换的节点。


在路由过程中,交换会从一个处理器流向另一个处理器;因此,你可以把路由看作是一个图,其中的节点是专门的处理器,而连接线则是一个处理器的输出和另一个处理器的输入。处理器可以是 EIP 的实现、特定组件的生产者,也可以是你自己的定制代码。下图显示了处理器之间的流程。

image


路由以消费者(即 DSL 中的 from )开始,消费者负责填充初始交换。在处理器的每一步,上一步的输出(out)报文都是下一步的输入(in)报文。在很多情况下,处理器不会设置输出报文,因此在这种情况下,输入报文会被重复使用。路由结束时,交换的交换模式决定是否需要向路由调用者发送回复。如果交换模式(MEP)是 InOnly,则不会发回回复。如果交换模式(MEP)是 InOut,Camel 会从上一步中获取并返回输出消息。

 组件


组件是 Camel 的主要扩展点。


从编程的角度来看,组件相当简单:它们与 URI 中使用的名称相关联,并充当端点工厂。


例如, FileComponent 在 URI 中被文件引用,它会创建 FileEndpoint 。.在 Camel 中,端点也许是一个更基本的概念。

 终点


端点是 Camel 的抽象概念,它是系统发送或接收信息的通道末端的模型。

image


在 Camel 中,您可以使用 URI(如 file:data/inbox?delay=5000 )来配置端点。也可以用这种方式引用端点。运行时,Camel 会根据 URI 符号查找端点。下图显示了其工作原理。

image


方案(1)表示由哪个 Camel 组件处理该类型的端点。在本例中, file 方案选择 FileComponent 。.然后, FileComponent 作为工厂,根据 URI 的其余部分创建 FileEndpoint 。上下文路径 data/inbox (2) 告诉 FileComponent 起始文件夹是 data/inbox .选项 delay=5000 (3) 表示应每隔 5 秒轮询一次文件。


下图显示了端点如何与交换机、生产者和消费者协同工作。

image


端点就像一个工厂,可以创建消费者和生产者,这些消费者和生产者能够接收和发送信息到特定的端点。

 制片人


生产者是 Camel 的抽象概念,指的是能向端点发送消息的实体。信息发送到端点后,生产者会处理获取与特定端点兼容的信息数据的细节。例如, FileProducer 将向 java.io.File 写入消息正文。. JmsProducer 另一方面, JmsProducer 在将 Camel 消息发送到 JMS 目的地之前,会将其映射到 javax.jms.Message 。这是 Camel 的一项重要功能,因为它隐藏了与特定传输交互的复杂性。您只需将消息路由到端点,生产者就能完成繁重的工作。

 消费者


消费者是一种服务,它接收由外部系统生成的消息,将其封装在交换中,然后发送给处理者。消费者是 Camel 中路由交换的来源。要创建一个新的交换,消费者将使用封装被消费的有效载荷的端点。然后,处理器通过路由引擎在 Camel 中启动交换路由。


Camel 有两种消费者:事件驱动消费者和轮询消费者(或计划轮询消费者)。这些消费者之间的区别非常重要,因为它们有助于解决不同的问题。

 事件驱动消费者


最熟悉的消费者是事件驱动型消费者,如图所示:

image


这种消费者大多与客户端-服务器架构和网络服务有关。在 EIP 领域,它也被称为异步接收器。事件驱动型消费者监听特定的消息传递通道,如 TCP/IP 端口、JMS 队列、Twitter 句柄、Amazon SQS 队列、WebSocket 等。然后,它等待客户端向其发送消息。当消息到达时,消费者就会被唤醒并接收消息进行处理。


轮询消费者/预定轮询消费者


与事件驱动消费者不同,轮询消费者会主动从特定来源(如 FTP 服务器)获取信息。在 EIP 术语中,轮询消费者也被称为同步接收器,因为它在处理完当前信息之前不会轮询更多信息。轮询消费者的一种常见形式是计划轮询消费者,它按计划的时间间隔进行轮询。文件、FTP 和电子邮件组件都使用计划轮询消费者。


在 Camel 组件中,只有事件驱动或计划轮询消费者才会被使用。轮询消费者(非计划)仅用于按需轮询,例如使用 Poll Enrich EIP,或通过 Java 从 Endpoint 中的 createPollingConsumer() 方法创建 PollingConsumer 实例。.

 另见


有关 Apache Camel 的高级架构,请参阅下文。


请参阅 "生命周期 "了解 CamelContext 的整个生命周期。.