spring学习

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 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值