一背景
在现在的网站中接入的渠道是越来越多了技术也是越来越先进WAP SMSEMAIL 传统的Web Socket等等如果连数据库和LDAP也算接入的话那在设计之中需要扩展的空间要做到很好 很好才保证在添加新的渠道情况下不需要更多的修改代码甚至不改代码的情况但可能吗我想也不可能但有什么方式可以更好的解决这种多渠道接入的框架的完美性呢
二构架
【图一】
如图一所显示在现有的所有接入都已经使用上的时候设计者看的都眼花缭乱了如果是为了凑份子那这些程序怎么写都可以而且也肯定可以实现但维护起来就会比较痛苦还是回到那个问题怎么可以实现更完美呢如图二显示
图二看起来象个八爪的章鱼章鱼腿分别连接所有的接入渠道进行连接所有这些渠道的核心就是这个章鱼的头XMLRouterRouter在此的作用是沟通所有渠道实现数据的路由争强系统在构架上的扩展性和灵活性好处会很多很多称呼为XMLRouter是因为如果不使用XML这种灵活而又规范的语言来做为数据传输的媒介那Router的工作量也同样会成倍的增加定义好XML的规范后将为以后的扩展带来很多好处
三思想和模式
XMLRouter的最初想法来自于计算机的主板和< >之中的Builder Pattern 计算机主板的PCI 插槽定义了PCI的规范只要你生产的卡符合PCI标准那你插入到这个主板上就可以工作 至于里面是怎么工作的则是已经封装好了 Builder Pattern则是提出将复杂的构建分离开来 一步一步的进行实现XMLRouter是将这些复杂的渠道分离开来一个个的进行表现
Services思想:为了能和Router进行沟通在这些渠道接入时必须定义统一的接口这里成为Services 只要符合Services规范的程序就可以接入到Router并进行数据的路由
Factory模式和Composite模式
XMLRouter在实际的设计中将采用Factory模式产生Router由RouterFactory生产 在投入使用时将放置于队列中传递数据和接收数据以及返回数据都从队列中取相应的Router来调用应用了Composite的模式
四XML配置文件
XML文件对于Router之中的使用分为两个部分 第一个是Router的配置如:
以下是引用片段
< xmlversion=>
< services>
< !databaseService>
< servicename=databasetype=databaseclass=comwebserviceDBService>
< connector
driver=commicrosoftjdbcsqlserverSQLServerDriver
url=jdbc:microsoft:sqlserver://:user=test
passwd=test/>
< /service>
< !WebService>
< servicename=webtype=webclass=comwebserviceWebService>
< connector/>
< /service>
……
< /services>
这是Router的配置文件 service节点代表需要接入的渠道 service节点包含connector子节点 子节点的配置根据type来区分 如果是database则包含url user passwddriver等属性 如果是socket则包含
port maxthread等属性 属性值可以根据自己的定义来配置
另一种XML文件则是XML交易数据文件用于在所有的services中传递数据每个Services自己包涵一个相应的XML文件比如webtransxml格式如下:
以下是引用片段
< xmlversion=>
< transaction>
< transname=addDocservice=databasemethod=insert>
< propertyname=createtimetype=timestamp/>
< propertyname=creatoridtype=long/>
< propertyname=doctypeidtype=int/>
< propertyname=docstatusidtype=int/>
< /trans>
< /transaction>
相应的dbtransxml格式如下
以下是引用片段
< transname=addDoctable=TDOC_DOCSmethod=insert>
< primarykeyname=docid/>
< set>
< propertyname=createtimetype=timestamp/>
< propertyname=creatoridtype=long/>
< propertyname=doctypeidtype=int/>
< propertyname=docstatusidtype=int/>
< /set>
< /trans>
其余XML则可按这样的规则来定制
五技术实现
RouterFactory
以下是引用片段
packagecomwebrouter;
importcomwebplatformExceptionRouterException;
importjavautiljava/util/ltarget=_blank>Hashtable;
以下是引用片段
/**
*Router产生和清除的类
*/
publicclassRouterFactory
{
/**
*Router存储的树front
*/
privatestaticjava/util/ltarget=_blank>HashtableQueuePairFront=null;
/**
*Router存储的树back
*/
privatestaticjava/util/ltarget=_blank>HashtableQueuePairBack=null;