企业集成模式实现(第一部分)

工程 | 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如果您不习惯使用不断变化的代码库,也可以选择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包中,您将找到与著名的星巴克故事实现相关的全部代码。为了向您介绍架构,我将按照从开始(咖啡馆)到结束(咖啡师)的顺序进行。

首先,订单由CafeDemo创建。它包含两杯饮料,一杯热饮,一杯冷饮。然后,订单被包装成一条消息并放入“orders”通道。监听“orders”通道的端点是分割器(OrderSplitter),在split方法中,订单被分割成多个饮料,然后框架又将它们分别包装成单独的消息。

在被分割并放入“drinks”通道后,饮料将由DrinksRouter处理。此路由器负责将热饮放入“hotDrinks”通道,将冷饮放入“coldDrinks”通道。这两个通道都由不同的端点处理,这些端点分别使用Barista上的prepareHotDrink和preprareColdDrink方法。

让我们跟踪消息在相关代码段中的流程:在cafeDemo.xml bean定义文件中,您可以看到Cafe被配置为一个bean。<beans:bean id="cafe" class="org.springframework.integration.samples.cafe.Cafe"> <beans:property name="orderChannel" ref="orders" /> </beans:bean>此bean由CafeDemo主方法用于将订单消息放入订单队列。 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); }

一个<context:component-scan ...../>正在使用中cafeDemo.xml引导OrderSplitter和DrinkRouter。

OrderSplitter使用一些注解:

  • @MessageEndpoint注解告诉Spring Integration在启用注解配置时将此类型的bean包装到一个端点中。此外,它是@Component的子类型,因此您无需编写xml bean定义即可让Spring获取它。
  • @Splitter注解告诉Spring使用splitOrder方法将包含Order作为有效负载的消息拆分成包含该Order饮料的多个消息。
@MessageEndpoint(input="orders", output="drinks") public class OrderSplitter {
@Splitter
public List<Drink> split(Message<DrinkOrder> orderMessage) {
	return orderMessage.getPayload().getDrinks();
}

}

DrinkRouter也同样用注解装饰,这些注解告诉Spring Integration将其用作路由器。从@Router注解的方法返回的字符串被Spring Integration解释为输出通道。@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<drink> drinkMessage) { Drink drink = drinkMessage.getPayload(); //代码其余部分没有更改 }

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

获取Spring新闻通讯

通过Spring新闻通讯保持联系

订阅

领先一步

VMware提供培训和认证,以加速您的进步。

了解更多

获得支持

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

了解更多

即将举行的活动

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

查看全部