CamelContext
CamelContext 是运行时系统,汇集了 Apache Camel 的所有基本概念(路由、端点、组件等)。
该上下文对象代表 Camel 运行时系统。通常情况下,一个应用程序中只有一个 CamelContext 实例。
![image](_images/images/camel-context.png)
CamelContext
可以访问许多功能和服务,其中最显著的是组件、类型转换器、注册表、端点、路由、数据格式和语言。
下表列出了 CamelContext
提供的最常见服务:
骆驼语境 101
为了让您更好地了解 Apache Camel,我们将讨论 CamelContext
中的内容。.
路线
路由是 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](_images/images/message_flow_in_route.png)
路由以消费者(即 DSL 中的 from
)开始,消费者负责填充初始交换。在处理器的每一步,上一步的输出(out)报文都是下一步的输入(in)报文。在很多情况下,处理器不会设置输出报文,因此在这种情况下,输入报文会被重复使用。路由结束时,交换的交换模式决定是否需要向路由调用者发送回复。如果交换模式(MEP)是 InOnly,则不会发回回复。如果交换模式(MEP)是 InOut,Camel 会从上一步中获取并返回输出消息。
组件
组件是 Camel 的主要扩展点。
从编程的角度来看,组件相当简单:它们与 URI 中使用的名称相关联,并充当端点工厂。
例如, FileComponent
在 URI 中被文件引用,它会创建 FileEndpoint
。.在 Camel 中,端点也许是一个更基本的概念。
终点
端点是 Camel 的抽象概念,它是系统发送或接收信息的通道末端的模型。
![image](_images/images/MessageEndpointSolution.gif)
在 Camel 中,您可以使用 URI(如 file:data/inbox?delay=5000
)来配置端点。也可以用这种方式引用端点。运行时,Camel 会根据 URI 符号查找端点。下图显示了其工作原理。
![image](_images/images/endpoint-uri-syntax.png)
方案(1)表示由哪个 Camel 组件处理该类型的端点。在本例中, file
方案选择 FileComponent
。.然后, FileComponent
作为工厂,根据 URI 的其余部分创建 FileEndpoint
。上下文路径 data/inbox
(2) 告诉 FileComponent
起始文件夹是 data/inbox
.选项 delay=5000
(3) 表示应每隔 5 秒轮询一次文件。
下图显示了端点如何与交换机、生产者和消费者协同工作。
![image](_images/images/endpoint-factory.png)
端点就像一个工厂,可以创建消费者和生产者,这些消费者和生产者能够接收和发送信息到特定的端点。
制片人
生产者是 Camel 的抽象概念,指的是能向端点发送消息的实体。信息发送到端点后,生产者会处理获取与特定端点兼容的信息数据的细节。例如, FileProducer
将向 java.io.File
写入消息正文。. JmsProducer
另一方面, JmsProducer
在将 Camel 消息发送到 JMS 目的地之前,会将其映射到 javax.jms.Message
。这是 Camel 的一项重要功能,因为它隐藏了与特定传输交互的复杂性。您只需将消息路由到端点,生产者就能完成繁重的工作。
消费者
消费者是一种服务,它接收由外部系统生成的消息,将其封装在交换中,然后发送给处理者。消费者是 Camel 中路由交换的来源。要创建一个新的交换,消费者将使用封装被消费的有效载荷的端点。然后,处理器通过路由引擎在 Camel 中启动交换路由。
Camel 有两种消费者:事件驱动消费者和轮询消费者(或计划轮询消费者)。这些消费者之间的区别非常重要,因为它们有助于解决不同的问题。
事件驱动消费者
最熟悉的消费者是事件驱动型消费者,如图所示:
![image](_images/images/EventDrivenConsumerSolution.gif)
这种消费者大多与客户端-服务器架构和网络服务有关。在 EIP 领域,它也被称为异步接收器。事件驱动型消费者监听特定的消息传递通道,如 TCP/IP 端口、JMS 队列、Twitter 句柄、Amazon SQS 队列、WebSocket 等。然后,它等待客户端向其发送消息。当消息到达时,消费者就会被唤醒并接收消息进行处理。
轮询消费者/预定轮询消费者
与事件驱动消费者不同,轮询消费者会主动从特定来源(如 FTP 服务器)获取信息。在 EIP 术语中,轮询消费者也被称为同步接收器,因为它在处理完当前信息之前不会轮询更多信息。轮询消费者的一种常见形式是计划轮询消费者,它按计划的时间间隔进行轮询。文件、FTP 和电子邮件组件都使用计划轮询消费者。
在 Camel 组件中,只有事件驱动或计划轮询消费者才会被使用。轮询消费者(非计划)仅用于按需轮询,例如使用 Poll Enrich EIP,或通过 Java 从 Endpoint 中的 createPollingConsumer() 方法创建 PollingConsumer 实例。. |