spring amqp股票交易(三)

可参考的资料:spring-amqp-dist-reference.pdf的3.7 Request/Reply Messaging
增加交互功能:这是个请求--回复消息的不错例子,从客户端UI发起请求,服务端处理请求,并进行响应(回调),返回客户端再处理.先从StockPanel入手.

一.客户端发起请求:
1.为StockPanel再添加一个Button,一个TextField,并为其添加相应事件.其中,点击按钮触发请求事件交给StockController处理.
2.此时,StockController.sendTradeRequest又成了Producer的起点,构造交易请求信息(TradeRequest)并由客户端(StockServiceGateway)发送.毫无疑问,这里的StockServiceGateway要使用依赖注入,其中实现为RabbitStockServiceGateway.
3.RabbitStockServiceGateway的send方法就是使用RabbitTemplate.convertAndSend(Object, MessagePostProcessor)进行发送请求.自然要为RabbitStockServiceGateway注入RabbitTemplate(详细见RabbitClientConfiguration.stockServiceGateway(),注意的是:此类继承RabbitGatewaySupport,所以不必再定义rabbitTemplate属性),此时rabbitTemplate bean设置了routingKey.
4.使用MessagePostProcessor实现回调功能(响应).通过回调设置replyTo的值,它是获取traderJoeQueue Bean的name.traderJoeQueue也是在RabbitClientConfiguration定义为bean,并且将该Queue添加到SimpleMessageListenerContainer,它的意义是作为响应的默认Queue,消息的处理同样在ClientHandler,稍后再提及.


二.服务端处理请求:
1.服务端的监听配置是在server-messaging.xml(不像客户端使用java-config),使用ServerHandler.handleMessage来处理,queue-names使用了spring表达试#{}进行注入stockRequestQueue这个bean的name.所以要先注册serverHandler和stockRequestQueue这两个bean.
2.serverHandler的注册是通过构造函数注入了executionVenueService,creditCheckService和tradingService属性.这三个bean都在handler方法使用到(具体看server-handlers.xml).
3.stockRequestQueue的注册在RabbitServerConfiguration,比较简单,只是声明一个Queue就可以.它依赖默认的direct exchange到每个queue都是隐式绑定的,这是实现回复的核心.
4.再回头看handle方法,其中核心是executionVenueService.executeTradeRequest(tradeRequest),这里的正常返回就是响应,根据listener的配置,默认的direct exchange会将消息转发到stockRequestQueue,下一步就会被客户端的监听处理了.


三.客户端处理响应:
1.根据一,可知会通过traderJoeQueue承载消息,交给ClientHandler.handler(TradeResponse)方法.此方法会只是输出一下日志,并委托给StockController.updateTrade(TradeResponse),但此方法双会委托给StockPanel.update(TradeResponse).
2.正常完成请求--回复时的TextField的字体颜色会由之前的灰变绿,TextField的文本内容由之前的"Request Pending..."变为"Confirmed.+股票代码+股票价格".
3.如果请求造成了异常(比如TextField填写的格式不对),那么TextField的字体颜色会变红,TextField的文本内容会变成"Required Format: 100 TCKR".


四.调试测试.

1.从服务端处理,可以看出没做任何验证,处理的方法也比较简单(看ExecutionVenueServiceStub.executeTradeRequest()),只是价格做了个随机数,其它的按请求原封不动返回.
2.从上面的分析和从StockController.sendTradeRequest()来看,只要TextField填写的格式是一个整形数+空格+字符串即可.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值