欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

spring学习

程序员文章站 2022-03-03 12:26:00
...
The Cafe Sample(小卖部订餐例子)
小卖部有一个订饮料服务,客户可以通过订单来订购所需要饮料。小卖部提供两种咖啡饮料LATTE(拿铁咖啡)和MOCHA(摩卡咖啡)。每种又都分冷饮和热饮整个流程如下:

1.有一个下订单模块,用户可以按要求下一个或多个订单。

2.有一个订单处理模块,处理订单中那些是关于订购饮料的。

3.有一个饮料订购处理模块,处理拆分订购的具体是那些种类的饮料,把具体需要生产的饮料要求发给生产模块4.有一个生产模块


这个例子利用Spring Integration实现了灵活的,可配置化的模式集成了上述这些服务模块。

先来看一下配置文件

<beans:beans xmlns="http://www.springframework.org/schema/integration"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/integration
http://www.springframework.org/schema/integration/spring-integration-1.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd">

<!-- 启动Message bus 消息服务总线 支持四个属性
auto-startup[boolean是否自动启动 default=true]如果设置false,则需要手动调用applicationContext.start()方法
auto-create-channels[boolean是否自动注册MessageChannel default=false],如果使用的MessagChannle不存在
error-channel 设置错误时信息发送的MessageChannle,如果不设置,则使用DefaultErrorChannel
dispatcher-pool-size 使用的启动线程数,默认为10-->
<message-bus/>
<!-- 启动支持元数据标记 -->
<annotation-driven/>
<!-- 设置 @Component标识的元数据扫描包(package) -->
<context:component-scan base-package="org.springframework.integration.samples.cafe"/>

<!-- 下面启动了四个 MessageChannel服务 处理接收发送端发过来的消息和把消息流转到消息的消费端 -->
<!-- 属性说明: capacity 消息最大容量默认为100 publish-subscribe是否是发布订阅模式,默认为否
id bean的id名称 datatype ? -->
<channel id="orders"/> <!-- 订单Channel -->
<channel id="drinks"/> <!-- 饮料订单Channel,处理饮料的类别 -->
<channel id="coldDrinks"/> <!-- 热饮生产Channel -->
<channel id="hotDrinks"/> <!-- 冷饮生产Channel -->

<!-- 消息处理终端 接收 channel coldDrinks的消息后,执行barista.prepareColdDrink方法 生产冷饮 -->
<!-- 属性说明: input-channel 接收消息的Channel必须 default-output-channel设置默认回复消息Channel
handler-ref 引用bean的id名称 handler-method Handler处理方法名(参数类型必须与发送消息的payLoad使用的一致)
error-handler设置错误时信息发送的MessageChannle reply-handler 消息回复的Channel -->
<endpoint input-channel="coldDrinks" handler-ref="barista"
handler-method="prepareColdDrink"/>

<!-- 消息处理终端 接收 channel hotDrinks的消息后,执行barista.prepareHotDrink方法 生产热饮 -->
<endpoint input-channel="hotDrinks" handler-ref="barista"
handler-method="prepareHotDrink"/>

<!-- 定义一个启动下定单操作的bean,它通过 channel orders下定单 -->
<beans:bean id="cafe" class="org.springframework.integration.samples.cafe.Cafe">
<beans:property name="orderChannel" ref="orders"/>
</beans:bean>
</beans:beans>



下面我们来看一下源代码目录:


我们来看一下整体服务是怎么启动的

首先我们来看一下CafeDemo这个类,它触发下定单操作

1 public class CafeDemo {
2
3 public static void main(String[] args) {
4 //加载Spring 配置文件
5 AbstractApplicationContext context = null;
6 if(args.length > 0) {
7 context = new FileSystemXmlApplicationContext(args);
8 }
9 else {
10 context = new ClassPathXmlApplicationContext("cafeDemo.xml", CafeDemo.class);
11 }
12 //启动 Spring容器(启动所有实现 org.springframework.context.Lifecycle接口的实现类的start方法)
13 context.start();
14 //从Spring容器 取得cafe实例
15 Cafe cafe = (Cafe) context.getBean("cafe");
16 DrinkOrder order = new DrinkOrder();
17 //一杯热饮 参数说明1.饮料类型 2.数量 3.是否是冷饮(true表示冷饮)
18 Drink hotDoubleLatte = new Drink(DrinkType.LATTE, 2, false);
19 Drink icedTripleMocha = new Drink(DrinkType.MOCHA, 3, true);
20 order.addDrink(hotDoubleLatte);
21 order.addDrink(icedTripleMocha);
22 //下100个订单
23 for (int i = 0; i < 100; i++) {
24 //调用cafe的placeOrder下订单
25 cafe.placeOrder(order);
26 }
27 }
28 }
相关标签: Spring Bean XML