目录
阅读时间: 5 分钟
如果你正在阅读这篇博客,我想你已经熟悉了Apache Camel。如果没有,首先请访问 "Apache Camel概述"。
在这篇博客中,我们将讨论Apache Camel的EIP模式(企业集成模式)。
什么是EIP?
EIP是一个设计模式的目录,用于开发系统以在商业环境中整合新的和现有的软件。此外,EIP还提供了65种设计模式,并包括一种名为GregorGrams的基于图标的模式语言。
Apache Camel支持Gregor Hohpe和Bobby Woolf的优秀著作中的大部分企业集成模式。
消息传递模式
所有的EIPs都被归为7个类别。
- 消息传递系统--回顾六种根基消息传递模式,对整个模式语言进行概述。
- 消息传递通道--应用程序通过通道进行通信。通道概述了一个消息将遵循的逻辑路径。总的来说,它显示了如何确定你的应用程序需要哪些通道。
- 消息构造--一旦你有了消息通道,你就需要消息在其上传输。此外,它还解释了消息经常被使用的方式以及如何利用它们的特殊属性。
- 消息路由--由于消息拓扑变得非常复杂,通常发送者对其消息的接收者了解甚少。相反,他们将消息发送到相邻的应用程序,这些应用程序将消息发送给其他人,直到消息最终找到它们的路径,到达它们的最终目的地。
- 消息转换--独立开发的应用程序在消息的格式、所谓的唯一标识符的形式和含义,甚至在使用的字符编码上都不一致。因此,中间组件需要将消息从一个应用程序产生的形式转换为其他应用程序消费的形式。此外,它显示了如何实现或设计这些转化器应用程序。
- 信息传递终端--在一个信息传递解决方案中,许多应用程序并没有被设计为参与其中。因此,他们明确地与消息传递系统相联系。此外,这在应用程序中定义了一个消息层,它负责发送和接收消息,使你的应用程序成为消息的端点。
- 系统管理--一旦你有了一个消息传递系统来整合你的应用程序,你如何确保它正确运行并做你想要的事情?总的来说,这探讨了如何测试和监控一个正在运行的消息系统。
让我们逐一了解每个类别。
信息传递系统。
在这里,我们将了解一个消息系统的基本构件。
消息。
在一个消息系统中,传输数据的最小单位是一个消息。消息可能包含多个部分。
消息的类型。
在Apache Camel中,org.apache.camel.Message接口有以下消息类型。
- 输入 消息 - 从消费者发送至生产者端点的消息。
- Out消息 - 从生产者端点发回给消费者端点的消息。此外,它通常是对In消息的响应)。
消息结构。
在Apache Camel中,所有消息类型的默认结构。
- 头信息- 通常包含从消息中提取的元数据。
- 主体- 一般来说,它是整个消息的原始形式。
- 附件- 是消息附件,用于与某些消息系统(如JBI)集成。
Example: from(SourceURL).setHeader("username", "John.Doe").to(TargetURL);
信息通道
消息通道是消息系统中的一个逻辑通道(而不是一个物理通道)。也就是说,将消息发送到不同的消息通道提供了一种独特的方式,将消息分类为不同的消息类型。
例子消息通道中的是消息队列和消息主题。
面向消息的组件
有26个 核心组件 和314个 非核心组件。以下是Apache Camel中面向消息的组件。
在ActiveMQ、JMS和AMQP中,消息通道由队列或主题表示。
例子 。特定队列(QueueName )或主题( )的端点URI有以下格式: TopicName)有以下格式。
ActiveMQ
activemq:QueueName
activemq:topic:TopicName
JMS
jms:QueueName
jms:topic:TopicName
AMQP
amqp:QueueName
amqp:topic:TopicName
消息端点
消息端点是应用程序和消息系统之间的接口。你可以有一个发送者端点,有时称为服务消费者,负责发送 在和一个接收端点,负责接收消息。 在消息。
端点的类型
在Apache Camel中,端点有2种类型。
- 消费者端点 - 它出现在Camel路由的开始,并读取 在从一个传入的通道(相当于一个接收器端点)读取消息。
- 生产者端点 - 出现在Apache Camel路由的末端,并将消息写入 在消息到一个传出通道(相当于一个发送端点)。一个路由可以有多个生产者端点。
端点URI
一个端点由一个端点URI来表示。它的一般形式如下。
ComponentPrefix:ComponentSpecificURI
- *
ComponentPrefix*识别一个特定的Apache Camel组件。 - *
ComponentSpecificURI*有一个由特定组件定义的语法。
例子:
- 要连接到JMS队列,
Foo.Bar,,端点URI为jms:Foo.Bar - 要定义一个路由,将消费者端点
file://local/router/messages/foo,直接连接到生产者端点jms:Foo.Bar,你可以使用下面的Java DSL片段。
from("file://local/router/messages/foo").to("jms:Foo.Bar");
管道和过滤器
管道和过滤器模式描述了一种通过创建一个过滤器链来构建路由的方式,其中一个过滤器的输出是管道中下一个过滤器的输入。此外,管道方法的优势在于它能让你创建更复杂的消息处理形式。
InOut交换模式的管道
管道将每个端点的输出连接到下一个相邻端点的输入。来自最后一个端点的Out消息被送回给最初的调用者。此外,你可以为这个管道定义一个路由,如下所示。
from("jms:RawOrders")
.pipeline("cxf:bean:decrypt", "cxf:bean:authenticate", "cxf:bean:dedup",
"jms:CleanOrders");
在Java DSL中,你可以使用两种语法中的任何一种来定义一个管道路由。
- 使用
pipeline()处理器命令-
from(SourceURI).pipeline(FilterA, FilterB, TargetURI);
- 使用*
to()*命令 -
from(SourceURI).to(FilterA, FilterB, TargetURI);
or
from(SourceURI)
.to(FilterA)
.to(FilterB)
.to(TargetURI);
一般来说,要避免使用to() 命令的语法,因为to() 可以被路由中的前一个命令所修改。例如,当multicast() 命令在to() 命令之前时,它不是用管道模式来绑定,而是将列出的端点绑定到一个多播模式。
消息路由器
消息路由器是一种过滤器,它从一个消费者端点消费消息,并根据特定的决策标准将它们重定向到特定的端点。一般来说,它不修改消息内容,只是重定向消息。
使用choice() 处理器可以很容易地实现一个消息路由器,其中每个备选的目标端点都可以使用when() 子条款来选择。
Java DSL的例子显示了如何根据foo头的内容将消息路由到三个备选目的地(seda:a ,seda:b, 或seda:c )。
from("seda:a").choice()
.when(header("foo").isEqualTo("bar")).to("seda:b")
.when(header("foo").isEqualTo("cheese")).to("seda:c")
.otherwise().to("seda:d");
首先,每个人都定义了一个谓词表达式(AND/OR)来检查一个条件。如果它是真的,使用to() 方法调用声明的目标将被执行。如果when() 方法调用中的条件都不为真,那么otherwise() 方法之后的目标将被执行。
结论
最后,你得到了Apache Camel中EIP模式的概述。请继续关注第二部分的内容。
阅读Apache-Camel手册了解更多知识。
同时,访问Knoldus博客以获得更多关于不同技术的信息。