实现企业集成模式,第 0 部分

工程 | Iwein Fuld | 2008 年 5 月 19 日 | ...

在我关于 Spring Integration 的演讲之后,我收到了很多关于澄清和示例的问题。为了满足需求,我将开始一个小型系列,介绍如何使用 Spring Integration 实现不同的集成模式。第一篇文章将重点介绍基础知识。它将向您展示如何启动并运行,并逐步讲解其中一个示例。

如果您之前从未听说过 Spring Integration,那么最好先通过阅读 Mark Fisher 撰写的介绍性博客 或浏览项目网站来熟悉它。总的来说

首先让我声明一点:您在此看到的模式仅用于说明 Spring Integration 提供的功能;语法可能因不同版本而异,并且您的系统可能需要额外的预防措施。

参与 Spring Integration 的第一步是下载项目并查看示例。所以让我们从这里开始

  1. 从 svn 检出源码svn co https://src.springframework.org/svn/spring-integration/trunk如果您不习惯使用不断变化的 codebase,您也可以选择 https://src.springframework.org/svn/spring-integration/tags/ 下的里程碑版本,但在撰写此博客时 M4 尚未发布,而我当然还是想向您展示最新的功能。请记住,当您阅读本文时,不要忘记检查 M4 是否已经发布。上次我检查时,它即将发布。
  2. 对整个项目运行构建
    $ cd build-spring-integration
    $ ant
  3. 将项目导入 Eclipse 并配置一个 IVY_CACHE 变量,使其指向您的 ivy 缓存。这通常是 build-spring-integration 旁边的目录。
  4. 打开 HelloWorldDemo 并作为 Java 应用程序运行。如果您之前做过,您会看到语法的变化。
如果运行正常,您就可以开始使用了。接下来您可以探索不同的示例。我将只描述 cafe 示例,因为它是最有趣的配置。

在示例项目的 cafe 包中,您将找到与实现著名的星巴克故事相关的所有代码。为了向您介绍架构,我将遵循从开始(Cafe)到结束(Barista)的订单流程。

首先,订单由 CafeDemo 创建。它包含两种饮料,一种热饮,一种冷饮。然后将订单包装在消息中,并放入 'orders' 渠道。监听 'orders' 渠道的端点是一个分派器(OrderSplitter),在 split 方法中,订单被拆分成多个 Drink,框架将这些 Drink 再次包装成单独的消息。

在被拆分并放入 'drinks' 渠道后,这些 Drink 由 DrinksRouter 处理。该路由器负责将热饮放入 'hotDrinks' 渠道,将冷饮放入 'coldDrinks' 渠道。这两个渠道分别由不同的端点处理,这些端点调用 Barista 上的 prepareHotDrink 和 prepareColdDrink 方法。

让我们跟随消息在相关代码片段中的流向:在 cafeDemo.xml bean 定义文件中,您可以看到 Cafe 被配置为一个 bean。<beans:bean id="cafe" class="org.springframework.integration.samples.cafe.Cafe"> <beans:property name="orderChannel" ref="orders" /> </beans:bean> CafeDemo 的 main 方法使用此 bean 将订单消息放入 orders 队列。 Cafe cafe = (Cafe) context.getBean("cafe"); DrinkOrder order = new DrinkOrder(); Drink hotDoubleLatte = new Drink(DrinkType.LATTE, 2, false); Drink icedTripleMocha = new Drink(DrinkType.MOCHA, 3, true); order.addDrink(hotDoubleLatte); order.addDrink(icedTripleMocha); for (int i = 0; i < 100; i++) { cafe.placeOrder(order); }

A<context:component-scan ...../>被用于cafeDemo.xml以引导 OrderSplitter 和 DrinkRouter。

OrderSplitter 添加了一些注解

  • @MessageEndpoint 注解告诉 Spring Integration 在启用 annotation-config 时将此类 bean 包装在端点中。此外,它是 @Component 的子类型,这样您就不需要编写 xml bean 定义让 Spring 拾取它。
  • @Splitter 注解告诉 spring 使用 splitOrder 方法将包含 Order 作为有效载荷的消息拆分成多个包含该 Order 的 Drink 的消息。
@MessageEndpoint(input="orders", output="drinks") public class OrderSplitter {
@Splitter
public List<Drink> split(Message<DrinkOrder> orderMessage) {
	return orderMessage.getPayload().getDrinks();
}

}

DrinkRouter 也类似地装饰了注解,告诉 Spring Integration 将其用作路由器。Spring Integration 将 @Router 注解方法返回的字符串解释为输出渠道。@MessageEndpoint(input="drinks") public class DrinkRouter {

@Router
public String resolveDrinkChannel(Drink drink) {
	return (drink.isIced()) ? "coldDrinks" : "hotDrinks";
}

}

路由之后,根据消息的温度,消息将分别在 hotDrinks 或 coldDrinks 渠道上可用。

配置为调用 Barista 上适当方法的端点在 xml 中配置:

您可以看到输入渠道和接收消息的方法都已定义,因此 Spring Integration 知道该怎么做。

请注意,您不需要自己解包消息:接受有效载荷类型作为输入参数也是可以的。如果您更改 Barista 中的方法以接受 Message并自行提取有效载荷,它仍会按预期工作。 public void prepareColdDrink(Message drinkMessage) { Drink drink = drinkMessage.getPayload(); //no changes to the rest of the code }

尝试运行示例,如果您遇到任何问题,请在论坛上发帖。您会发现它们已经非常有帮助(主要是因为 Mark 回复了几乎所有帖子)。下一集将介绍另一种 EIP 的实现。

获取 Spring 新闻通讯

订阅 Spring 新闻通讯,保持连接

订阅

抢占先机

VMware 提供培训和认证,助力您的快速进步。

了解更多

获得支持

Tanzu Spring 通过一个简单的订阅提供对 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件。

了解更多

即将举行的活动

查看 Spring 社区所有即将举行的活动。

查看全部