本章概述
-
路由概述
-
介绍 Rider Auto Parts
-
FTP和JMS端点的基础知识
-
使用Java DSL创建路由
-
在XML中配置路由
-
路由使用循环
-
路由概述
路由发生在日常生活的许多方面。例如,当你寄信时,在到达最终地址之前,可能要经过几个城市。你发送的电子邮件在到达最终目的地之前会经过许多计算机网络系统。在所有情况下,路由器的功能是有选择地向前移动消息。
在企业消息传递系统的上下文中,路由是将消息从输入队列中取出,并根据一组条件将其发送到几个输出队列中的一个的过程,如图2.1所示。输入和输出队列不知道它们之间的条件。条件逻辑与消息使用者和生产者解耦。
在Camel中,路由是一个更通用的概念。它被定义为消息的一步一步的移动,消息从使用者角色的端点开始。使用者可以从外部服务接收消息,在系统上轮询消息,甚至创建消息本身。然后,此消息流经处理节点,处理节点可以是企业集成模式(EIP)、处理器、拦截器或其他定制创建。消息最终被发送到扮演生产者角色的目标端点。一个路由可能有许多处理组件,这些组件修改消息或将其发送到另一个位置,也可能没有,在这种情况下,它将是一个简单的管道。
这一章介绍了一个虚构的公司,我们在整本书中使用它作为连续的例子。为了支持该公司的用例,您将学习如何使用Camel的端点通过FTP和Java Message Service (JMS)进行通信。接下来,您将深入研究用于创建路由的基于java的领域特定语言(DSL)和基于xml的DSL。我们还将简要介绍如何使用eip和Camel设计和实现企业集成问题的解决方案。在本章的最后,您将足够熟练地使用Camel创建有用的路由应用程序。
作为第一个任务,您需要在Rider订单前端系统中实现FTP模块。在本章的后面,您还将看到后端服务是如何实现的。FTP模块的实现包括以下步骤:
1.轮询FTP服务器并下载新订单
2.将订单文件转换为JMS消息
3.将消息发送到JMS incomingOrders队列
要完成步骤1和步骤3,您需要了解如何使用Camel的端点通过FTP和JMS进行通信。要完成整个任务,您需要理解使用Java DSL的路由。让我们首先看看如何使用Camel的端点。
2.2 理解端点
正如在第1章中所读到的,端点是对消息通道末端建模的抽象,系统可以通过该通道发送或接收消息。本节介绍如何使用URI配置Camel以通过FTP和JMS进行通信。让我们先看看FTP。
2.2.1从FTP终端消费
使Camel易于使用的一个因素是端点URI。通过端点URI,您可以标识要使用的组件以及该组件的配置方式。然后,您可以决定将消息发送到由该URI配置的组件,或者使用来自该URI的消息。
以第一个汽车零部件项目为例。从FTP服务器下载新订单,需要执行以下操作:
1.使用默认的FTP端口21连接rider.com FTP服务器。 2.提供rider的用户名和secret的密码。3.将目录更改为orders。4.下载任何新的订单文件
如图2.3所示,可以通过使用URI表示法轻松配置Camel。
rider.com/orders的上下文路径告诉FtpComponent,它应该在默认FTP端口的rider.com登录到FTP服务器,并将目录更改为orders。最后,唯一指定的选项是用户名和密码,用于登录到FTP服务器。
FtpComponent不是Camel核心模块的一部分,所以必须向项目添加一个依赖项。使用Maven,您可以向POM添加以下依赖项:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-ftp</artifactId>
<version>2.20.1</version>
</dependency>
尽管这个端点URI在消费者或生产者场景中同样可以很好地工作,但您将使用它从FTP服务器下载订单。为此,您需要在Camel的DSL的from节点中使用它:
从(“ftp://rider.com/ordersusername=rider&password=secret”) 这就是使用FTP服务器上的文件所需要做的一切。您可能还记得图2.2中所示,您需要做的下一件事是将从FTP服务器下载的订单发送到JMS队列。这个过程需要更多的设置,但仍然很简单。
2.2.2发送到JMS端点
Camel为连接到支持JMS的提供程序提供了广泛的支持,我们将在第6章中讨论所有细节。回想一下,您需要从FTP服务器下载订单并将它们发送到JMS队列。
JMS是什么?
Java消息服务(JMS)是一个Java API,允许您创建、发送、接收和读取消息。它还要求消息传递是异步的,并具有特定的可靠性元素,如有保证的和一次且仅一次交付。JMS可能是Java社区中部署最广泛的消息传递解决方案。
在JMS中,消息消费者和生产者通过中介(JMS目的地)彼此通信。如图2.4所示,目的地可以是队列,也可以是主题。队列严格是点对点的;每条消息只有一个使用者。主题根据发布/订阅计划运作;一条消息可以传递给许多订阅了该主题的消费者。
JMS还提供了一个ConnectionFactory,客户机(例如Camel)可以使用该ConnectionFactory创建与JMS提供程序的连接。JMS提供者通常被称为代理,因为它们管理消息生产者和消息消费者之间的通信。
如何配置Camel以使用JMS提供程序
要将Camel连接到特定的JMS提供程序,您需要使用适当的ConnectionFactory配置Camel的JMS组件。
Apache ActiveMQ是最流行的开源JMS提供程序之一,也是Camel团队用来测试JMS组件的主要JMS代理。因此,我们将在本书中使用它来演示JMS概念。在Apache ActiveMQ的情况下,你可以创建一个 ActiveMQConnectionFactory,它指向正在运行的ActiveMQ代理的位置:
ConnectionFactory connectionFactory =
new ActiveMQConnectionFactory("vm://localhost");
接下来,创建CamelContext时,可以添加JMS组件,如下所示:
CamelContext context = new DefaultCamelContext();
context.addComponent("jms",JmsComponent.jmsComponentAutoAcknowledge(connectionFactory));
JMS组件和activemq特定的连接工厂不是Camel核心模块的一部分。要使用这些,需要向基于maven的项目添加依赖项。对于普通JMS组件,只需要添加以下内容:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-jms</artifactId>
<version>2.20.1</version>
</dependency>
连接工厂直接来自ActiveMQ,需要以下依赖项:
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
<version>5.15.2</version>
</dependency>
现在已经配置了JMS组件以连接到JMS代理,现在可以看看如何使用URI来指定目的地。
使用uri指定目的地
配置JMS组件后,可以开始在闲暇时发送和接收JMS消息了。因为使用的是uri,所以配置起来非常简单。
假设想要向名为incomingOrders的队列发送一条JMS消息。本例中的URI如下:
jms:queue:incomingOrders
jms前缀表示正在使用之前配置的jms组件。通过指定queue, JMS组件知道发送到名为incomingOrders的队列。甚至可以省略队列限定符,因为默认行为是发送到队列而不是主题。
使用Camel的Java DSL,您可以通过使用to关键字向incomingOrders队列发送消息,如下所示:
.to("jms:queue:incomingOrders")
2.3用Java创建路由
在第1章中,你看到了RouteBuilder可以用来创建路由,并且每个CamelContext可以包含多个路由。不过,RouteBuilder并不是CamelContext在运行时使用的最终路由,这一点可能并不明显;它是一条或多条路线的构建器,然后将这些路线添加到CamelContext中。如图2.5所示。
CamelContext的addroues方法接受RoutesBuilder,而不仅仅是RouteBuilder。RoutesBuilder接口定义了一个方法:
void addRoutesToCamelContext(CamelContext context) throws Exception;