模式发现者
:
蔡超
北京天融信,软件架构师
SUN certified Enterprise Architect
Microsoft certified Solution Developer
IBM certified RUP Specialist
联系方式
:cai_chao@topsec.com.cn,chaocai2001@yahoo.com.cn
010-82776427
语境
在基于异步通信方式的系统中,实现模块的同步调用。
问题
消息队列已经成为目前很多软件选用的通讯方式,消息模式使得不同分布式组件间的耦合性较为松散,提高了系统的可维护性和可扩充性。但是有时我们希望在这种情况下能够模拟同步的调用方式,希望能够通过一个组件透明的帮我们实现这种异步和同步调用的转换。
解决方案
图表
1
基于消息的分布式系统
上图是一种常见的基于消息的分布系统结构,系统中包含两条队列。命令队列用于传送模块间相互调用的命令对象,响应队列用于传送命令处理后的响应结果对象。
在通常情况下消息队列上的模块会以异步的方式工作,这种情况下模块通常不关心命令执行后的状况,常常是不须返回值的。
为了模拟同步调用我们通过一个
SynProxy
组件来帮助我们完成由异步到同步调用的模拟。使得
Client
对其他模块的调好像是同步的一样。
SynProxy
组件的结构如下:
图表
2
SynProxy
的静态结构
SynProxy:
组织完成异步到同步调用的转换
WaitingQueue:
存放还未获得执行返回值的
Command
对象
UIDCreator:
产生能够唯一标示每个
Command
对象的
UID
ResponseReceiver:
监听响应队列中的响应消息,它在独立的线程中运行
Command
:命令对象
Response
:响应对象
图表
3
将异同步调用转化成同步调用的过程
部分解释:
(
以上以在
JAVA
环境中为例
)
Wait
表示调用
Command
的
wait
方法阻塞住当前线程
Command
执行模块在执行了响应操作后生产
Response
对象用于放回结果,
Response
对象中的
UID
属性应该与处理的
Command
的
UID
的值相同
Notify
表示调用
Command
的
notify
方法唤醒被阻塞的线程
上面过程中的
wait
设置了阻塞的超时时间(来自于
Command
对象的属性值)