Spring Integration:jms范例分析

分析对象:

Spring-Integration-Sample-jms

common.xml, inbound-Gateway.xml, outbound-Gateway.xml, DemoBean.java, GatewayDemo.java

一、让例子跑起来 make it run!

运行GatewayDemo。将通过Broker方式启动ActiveMQ, 如果将common.xml中brokerURL修改为tcp://localhost:61616, 则可使用外置的Standalone ActiveMQ服务器。

启动后,在控制台输入任意字符后回车,控制台将返回你输入字母的大写字母。

二、分析, how it works?

根据配置文件,可以将消息的路由绘制如下:

spring integration jms

<stream:stdin-channel-adapter> 是一个管道适配器,将不同类型的管道进行连接。把System.in这个输入转换到stdinToJmsoutChannel这个管道中。

<jms:outbound-gateway> 标签定义了一个写消息网关(这里outbound是从Application到JMS),会将输入管道中的数据发送到JMS Queue中(requestQueue);

<jms:inbound-gateway> 标签定义了一个读消息网关(从JMS Queue到Application代码),从requestQueue中将消息读出来之后写入demoChannel1管道。

通过demoChannel1管道,将信息发送给一个<service-activator>,这是一个通用意义的Message Endpoint, 是对消息进行处理的关键点。调用demoBean这个Spring Bean的upperCase方法。(可能有人找不到什么地方定义了demoBean,是因为这个Bean定义是隐含的,通过<context:component-scan base-package="org.springframework.integration.samples.jms"/>自动引入的,为什么执行demoBean.upperCase方法,是因为DemoBean.upperCase这个方法具有@ServiceActivator标签)

upperCase返回的结果会被写入到jmsReplyToStdoutChannel这个管道中。(这是在outbound gateway中定义的,向queue写入消息时就在Message的Header中添加上了对应的信息,在<service-activator>中如果没有显式地定义replyChannel,就会根据Message Header中的返回地址去找。)

最终通过stdout这个<stream:stdout-channel-adapter>将jmsReplyTostdoutChannel管道中的消息进行转换,输出到System.out中。

三、Hack into

如果我们不从控制台输入信息,是否也能执行呢?我们通过一个代码向stdinToJmsoutChannel管道写入一个信息,然后就可以在控制台获得一个输出。

通过应用代码操作JMS,当然最好是通过Gateway了。我们定义一个接口:

注意@Gateway Annotation, 其requestChannel定义为原来stdin适配器的管道stdinToJmsoutChannel.

然后在common.xml中定义对应的<integration:gateway id="myGateway" service-interface="xxx.xxx.xxxx.MyGateway" />。

最后,只需要在main方法中进行调用就可以了。

 

停!

 

MyGateway只是一个接口,能直接执行吗? 呵呵,是可以的,原因参见我的另外一个文章《接口能直接运行吗?

再次运行,这回是不是不用在控制台输入,就可以获得一个输出了?

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值