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