【Apache Camel】基础知识
- [Apache Camel是什么](#Apache Camel是什么)
- [Apache Camel基本概念和术语](#Apache Camel基本概念和术语)
-
- CamelContext
- Endpoints
- Routes
- RouteBuilder
- Components
- Message
- Exchange
- Processors
- [Domain Specific Language(DSL)](#Domain Specific Language(DSL))
- [Apache Camel 应用执行步骤](#Apache Camel 应用执行步骤)
- [Apache Camel 示意图](#Apache Camel 示意图)
- 参考
Apache Camel是什么
Apache Camel是一个基于 EIP(Enterprise Integration Patterns) 的通用开源集成框架,用于集成各种异构系统,完成异构系统间数据交换和共享。
Apache Camel基本概念和术语
CamelContext
CamelContext 是 Camel 的运行时系统,管理了 Routes、Endpoints、Components、Message 等,工作方式类似 Spring ApplicationContext。通过 CamelContext 可以访问 Components、Endpoints、Routes、Type converters、Data formats、Registry、Languages。
通常应用程序中只有一个 CamelContext,但也可以同时存在多个 CamelContext,但多个 CamelContext 之间彼此需要隔离,如果要在多个 CamelContext 之间通信,则需要加入一个传输层(如消息队列)。
Endpoints
Endpoints 代表了一个可以通过某个地址 URL 进行通信的命名软件实体或资源,可以简单理解为是一个接口。可以从 Endpoints 中检索(Consumer Endpoints)或发送(Producer Endpoints)数据以进行路由及数据操作。
配置 Endpoints 的 URI 格式:
- Schema:表示哪个 Component 组件处理此类 Endpoint,本例中的
file
表示使用FileComponent
,FileComponent
被当做工厂,根据 URI 剩余部分创建FileEndpoint
; - Context path:上下文路径,本例中配置
FileComponent
的起始文件夹是data/inbox
; - Options:选项,本例中配置以5s的时间间隔轮询文件。
Endpoints 充当工厂,用于创建能够接收 Message 的 Consumer,或将 Message 发送到特定 Endpoint 的 Producer。
Routes
Routes 用于连接源 Endpoints 和目标 Endpoints,Routes 描述了消息从源 Endpoints 到目标 Endpoints 的移动过程。
RouteBuilder
封装了 Camel 运行时使用的规则(Rules)、Endpoints 和 Components,每个 CamelContext 可以包含一个或多个 RouteBuilder,RouteBuilder 被扩展并添加到 CamelContext 中以描述路由规则。通常自定义 RouteBuilder 继承自 org.apache.camel.builder.RouteBuilder
。
Components
Components 是一个基础构建模块,负责在路由构建过程中创建 Endpoints,Camel 提供了大量内置的 Components,这些 Components 提供了与各种技术和协议的连接。
Message
Message 接口提供了单个消息的抽象表示,如请求消息、回复消息、异常消息。Message 接口 API 提供了 Getter 和 Setter 方法用于访问消息ID、消息体(Body)和消息头(Header)的单个字段。
Exchange
Exchange 接口提供了一次消息交换的抽象表示,一次消息交换是指一个请求消息及其对应的回复或异常消息。Camel 将请求消息、回复消息、异常消息称为 in messages、out messages、fault messages。
Processors
Processors 在消息交换过程中对消息进行处理,可用作消息转换器实现。定义 Routes 时可以添加 Processors 在消息交换过程中执行自定义逻辑。自定义 Processor 需要实现 org.apache.camel.Processor
接口并重写 process()
方法,方法参数为 Exchange
而非 Message
。
Domain Specific Language(DSL)
领域特定语言,用于定义 Routes,主要包含三类:
- XML
- YAML
- Java DSL
Apache Camel 应用执行步骤
- 创建 CamelContext 对象;
- 添加 Endpoints 和 Components;
- 在 CamelContext 中添加路由 Routes,连接源 Endpoints 和目标 Endpoints;
- 调用 CamelContext 的
start()
方法启动 Camel 内部线程负责发送、接收、处理 Endpoints 中的消息 Message; - 最后,调用 CamelContext 的
stop()
方法,优雅地停止所有的 Endpoints 和 Camel 内部线程。
需要注意:
- CamelContext 的
start()
方法不会无限期阻塞,在启动了每个 Component 和 Endpoint 的内部线程后就返回了,相反stop()
方法会等待每个 Endpoint 和 Component 内部的所有线程都终止后才返回; - 如果忽略调用
start()
方法,Camel 将不会处理消息,因为内部线程还未创建; - 如果终止应用前忽略调用
stop()
方法,那么可能会以不一致的状态终止,如果在 JUnit 测试中忽略调用 CamelContext 的stop()
方法则可能导致失败,因为消息没有机会得到完全处理。