Apache Camel - 6 - Camel结构
在高层次上,Camel是由处理器,组件和路由组成的。 所有这些都包含在CamelContext中
路由引擎由DSL将终端和处理器连接在一起形成路由。
路由引擎使用路由作为消息路由的规范。
路由使用Camel的域特定语言(DSL)之一来定义。 处理器用于在路由期间转换和操作消息,并实现所有的EIP模式,这些模式在DSL语言中都有相应的关键字。组件是Camel中用于向其他系统添加连接的扩展点。 为了将这些系统公开给Camel的其他部分,组件提供了一个端点接口。
CamelContext是一个容器。 你可以把它看作Camel的运行时系统,它把所有的东西放在一起。
CamelContext提供了许多有用的服务,最值得注意的是组件,类型转换器,注册表,端点,路由,数据格式和语言
路由显然是Camel的核心抽象。定义路由最简单的方法就是作为一个处理器链。 在消息应用程序中使用路由器有很多原因。 通过解耦客户端与服务器,以及消费者的生产者,路由可以
■动态决定客户端将调用什么服务器
■提供灵活的方式来添加额外的处理
■允许客户和服务器独立开发
■允许服务器的客户端被删除(使用mock)进行测试
■通过连接完成一件好事的不同系统来培养更好的设计实践
■增强某些系统(如消息代理和ESB)的功能和特性
Camel中的每条路线都有唯一的标识符,用于记录,调试,监控以及启动和停止路线。 路由也只有一个消息输入源,所以它们被有效地绑定到一个输入端点。
为了定义路由,使用DSL。
DOMAIN-SPECIFIC LANGUAGE (DSL)(域特定语言(DSL))
为了将处理器和终端连接起来形成路由,Camel定义了一个DSL。 DSL这个术语在这里有点松散。 在Camel中,DSL意味着流畅的Java API,其中包含为EIP术语命名的方法。
PROCESSOR(处理器)
处理器是一个核心Camel概念,代表了一个能够使用,创建或修改传入交换的节点。 在路由期间,交换从一个处理器流向另一个; 因此,您可以将路由视为具有专用处理器作为节点的图形,以及将一个处理器的输出连接到另一个处理器的输入的线路。 许多处理器都是EIP的实现,但是可以轻松实现自己的定制处理器并将其插入到路由中。
COMPONENT(组件)
组件是Camel的主要扩展点。到目前为止,Camel生态系统中有80多个组件,其功能从数据传输到DSL,数据格式等等。 你甚至可以为Camel创建自己的组件,我们将在第11章讨论这个组件。
从编程角度来看,组件非常简单:它们与URI中使用的名称相关联,它们作为端点的工厂。 例如,FileComponent通过URI中的文件引用,并创建FileEndpoints。
端点也许是Camel更基本的概念。
ENDPOINT(端点)
在Camel中,您使用URI配置端点,例如file:data/inbox?delay=5000,您也可以用这种方式引用端点。在运行时,Camel将根据URI表示法查找端点
FileComponent然后作为一个工厂创建基于URI的剩余部分的FileEndpoint。上下文路径data/inbox②通知FileComponent起始文件夹是data/inbox。选项delay=5000 图1.9中③表示应该以5秒的间隔轮询文件。
生产者是Camel抽象,是指能够创建消息并将消息发送到端点的实体。 图1.10说明了生产者适合其他Camel概念的地方。
当需要将消息发送到端点时,生产者将创建一个交换并使用与该特定端点兼容的数据来填充它。
例如,FileProducer会将消息正文写入文件。 另一方面,JmsProducer会将Camel消息映射到javax.jms.Message,然后将其发送到JMS目标。 这是Camel的一个重要特征,因为它隐藏了与特定运输交互的复杂性。 所有你需要做的就是把消息路由到一个端点,生产者做繁重的工作
CONSUMER(消费者)
消费者是接收生产者产生的消息的服务,将其包装在交换中并发送给他们进行处理。 消费者是Camel交易的来源。
回顾图1.10,我们可以看到消费者与其他Camel概念适合的位置。 为了创建新的交换,消费者将使用包装所消耗的有效载荷的端点。 然后使用处理器来使用路由引擎启动Camel交换机的路由。
在Camel中有两种消费者:事件驱动的消费者和轮询的消费者。
EVENT-DRIVEN CONSUMER(事件驱动的消费者)
一个事件驱动的消费者等待空闲,直到消息到达,然后唤醒并消费该消息。
这种消费者大多与客户端 - 服务器体系结构和Web服务相关联。 它在EIP世界中也被称为异步接收器。
事件驱动的使用者在特定的消息通道(通常是TCP / IP端口或JMS队列)上侦听,并等待客户端向其发送消息。 当消息到达时,消费者醒来并把消息处理。
与事件驱动的消费者形成对比的是,轮询消费者主动从特定源(例如FTP服务器)获取消息。 轮询消费者也被称为EIP术语中的同步接收者,因为它在处理完当前消息之前不
轮询更多的消息。 轮询消费者的常见口味是排定的轮询消费者,其按预定的时间间隔进行轮询。 文件,FTP和电子邮件传输都使用计划的轮询使用者。
Apache Camel - 7 - Camel数据转换
转换的逻辑,camel中一般写在processor中的process方法实现
Apache Camel - 8 - Camel特殊的Endpoint
Endpoint Direct用于在两个编排好的路由之间实现Exchange消息的连接;
上一个路由中由最后一个元素处理完的Exchange对象,将被发送至由Direct连接的下一个路由起始位置。
Endopint Direct元素在我们实际使用Camel进行路由编排时,应用频度非常高。
因为它可以把多个已编排好的路由按照业务要求连接起来,形成一个新的路由,保持原有路由的良好重用。
Apache Camel - 9 - Camel路由条件
消息路由器消耗来自输入通道的消息,并根据一组条件将消息发送到一组输出通道之一。
在企业消息传递系统中,路由是指从输入队列中获取消息的过程,并根据一组条件发送到多个输出队列之一,如图2.1所示。
这实际上意味着输入和输出队列不知道它们之间的条件。
条件逻辑与消息使用者和生产者分离。
在ApacheCamel中,路由是一个更一般的概念。它被定义为一步一步的消息的移动,消息的起源于消费者角色的端点。消费者可以从外部服务接收消息,在某个系统上轮询消息,甚至创建消息本身。然后这个消息流经一个处理组件,这个组件可能是一个企业集成模式(EIP),一个处理器,一个拦截器或者其他一些自定义的创建。该消息最终被发送到作为生产者角色的目标端点。一个路由可能有许多处理组件修改消息或发送到另一个位置,或者它可能没有,在这种情况下,它将是一个简单的管道。
Routing路由条件
在控制端点和处理器之间、处理器与处理器之间,Camel允许开发人员进行路由条件的设置。
开发人员甚至还可以通过路由规则完成Exchange到多个Endpoint的负载传输。
Camel中支持的路由规则非常丰富,包括:MessageFilter、Based Router、Dynamic Router、Splitter、Aggregator、Resequencer等等。
Content Based Router 基于内容的路由
其中可能包括choice语句/方法、when语句/方法、otherwise语句/方法
由于我们设置的from-jetty-endpoint中默认的Exchange Pattern值为InOut,所以在各个Processor处理器中完成处理后,Out Message的Body内容会以HTTP响应的结果形式返回到from-jetty-endPoint中
以上代码中,我们使用multicast()将原始的Exchange复制了多份,分别传送给multicast中的两个接收者;
为了保证两个接收者的处理过程是并行的,我们还专门为multicast设置了一个线程池(不设置的话,Camel将自行设置)。
以下代码示例中,我们将三个已经编排好的路由注册到Camel服务中
循环动态路由 Dynamic Router
动态循环路由的特点是开发人员可以通过条件表达式等方式,动态决定下一个路由位置。
在下一路由位置处理完成后Exchange将被重新返回到路由判断点,并由动态循环路由再次做出新路径的判断。
如此循环执行直到动态循环路由不能再找到任何一条新的路由路径为止
Apache Camel - 10 - File组件(1)
File组件提供对文件系统的访问,允许任何其他Camel组件处理文件或将其他组件的消息保存到磁盘
Only directories(只有目录)
Camel只支持配置有起始目录的端点。 所以directoryName必须是一个目录。
如果只想使用单个文件,则可以使用fileName选项,例如通过设置fileName=thefilename。
此外,起始目录不得包含具有$ {}占位符的动态表达式。
再次使用fileName选项来指定文件名的动态部分。
避免读取当前正在被其他应用程序写入的文件
请注意,JDK文件IO API在检测另一个应用程序当前正在写入/复制文件时有点受限。
而且实现可以根据OS平台而有所不同。
这可能导致Camel认为该文件没有被另一个进程锁定,并开始使用它。
默认情况下,Camel使用基于内存的存储来跟踪消耗的文件,它使用最近最少使用的高速缓存,最多可容纳1000个条目。 您可以通过使用idempotentRepository选项使用值中的#号来插入您自己的此存储实现,以指示它是否使用指定的ID引用注册表中的bean。
Apache Camel - 11 - File组件(2)
Camel File组件 线程池