在如今的网站中,接入的渠道是愈来愈多了,手艺也是愈来愈先进,WAP, SMS,EMAIL, 传统的Web, Socket等等,假如连数据库和LDAP也算接入的话,那在设想当中须要扩大的空间要做到很好 很好,才保证在增添新的渠道状况下不须要更多的修正代码以至不改代码的状况。但能够吗?我想也不能够,但有什么体式格局能够更好的处置惩罚这类多渠道接入的框架的圆满性呢?
二.构架
【图一】
如图一所显现,在现有的一切接入都已运用上的时刻,设想者看的都头昏眼花了,假如是为了凑份子,那这些顺序怎样写都能够,而且也一定能够完成,但保护起来就会比较痛楚,照样回到那个问题,怎样能够完成更圆满呢?如图二显现:
【图二】
图二看起来象个八爪的章鱼,章鱼腿离别衔接一切的接入渠道,举行衔接一切这些渠道的中心就是这个章鱼的头xmlRouter,Router在此的作用是沟通一切渠道,完成数据的路由,争强体系在构架上的扩大性和天真性,优点会许多许多。称谓为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的设置,如:
以下是援用片断:
<?xml version="1.0" ?> <services> <!-- database Service --> <service name="database" type="database" class="com.web.service.DBService"> <connector driver="com.microsoft.jdbc.sqlserver.SQLServerDriver" url="jdbc:microsoft:sqlserver://192.168.0.179:1433" user="test" passwd="test" /> </service> <!-- Web Service--> <service name="web" type="web" class="com.web.service.WebService" > <connector /> </service> …… </services>
这是Router的设置文件, service节点代表须要接入的渠道, service节点包括connector子节点, 子节点的设置依据type来辨别, 假如是database则包括url, user, passwd,driver等属性, 假如是socket则包括 port, maxthread等属性, 属性值能够依据本身的定义来设置.
另一种XML文件则是XML生意业务数据文件,用于在一切的services中通报数据,每一个Services本身见谅一个响应的XML文件,比方webtrans.xml花样以下:
以下是援用片断:
<?xml version="1.0" ?> <transaction> <trans name="addDoc" service="database" method="insert"> <PRoperty name="createtime" type="timestamp"/> <property name="creatorid" type="long"/> <property name="doctypeid" type="int"/> <property name="docstatusid" type="int"/> </trans> </transaction>
响应的dbtrans.xml花样以下
以下是援用片断:
<trans name="addDoc" table="TDOC_DOCS" method="insert"> <primarykey name="docid" /> <set> <property name="createtime" type="timestamp"/> <property name="creatorid" type="long"/> <property name="doctypeid" type="int"/> <property name="docstatusid" type="int"/> </set> </trans>
其他XML则可按如许的划定规矩来定制
五.手艺完成
RouterFactory
以下是援用片断:
package com.web.router; import com.web.platform.Exception.RouterException; import java.util.java/util/Hashtable.java.html" target="_blank">Hashtable;
以下是援用片断:
/** * Router发生和消灭的类 */ public class RouterFactory { /** * Router存储的树front */ private static java/util/Hashtable.java.html" target="_blank">Hashtable QueuePairFront = null; /** * Router存储的树back */ private static java/util/Hashtable.java.html" target="_blank">Hashtable QueuePairBack = null; /** * Router存储的树 */ private static java/util/Hashtable.java.html" target="_blank">Hashtable QueueRouter = null; /** * 返回的XMLRouter */ public static XMLRouter instance = null; /** * Router的定义 */ public static RouterDefine routerdefine = null; /** * Router的ID号 */ public static long routeIndex = 0; /** * @roseuid 3F169C21027C */ public RouterFactory() { } /** * 初始化Hashtable和Vector */ public static void initFactory() throws java/lang/Exception.java.html" target="_blank">Exception { QueuePairFront = new java/util/Hashtable.java.html" target="_blank">Hashtable(); QueuePairBack = new java/util/Hashtable.java.html" target="_blank">Hashtable(); QueueRouter = new java/util/Hashtable.java.html" target="_blank">Hashtable(); initRouteDefine(); } /** * 初始化Route的设置 * */ private static void initRouteDefine() throws java/lang/Exception.java.html" target="_blank">Exception { if( routerdefine == null ) routerdefine = new RouterDefine(); routerdefine.loadRouterDef(); } /** * 返回实例 * @return com.web.router.XMLRouter */ public static XMLRouter getInstance(long index) throws RouterException { return (XMLRouter)QueueRouter.get(new java/lang/Long.java.html" target="_blank">Long(index)); } /** * 发生一个XMLRouter的实例 * @return com.web.router.XMLRouter * @roseuid 3F1618A103BC */ public static XMLRouter popInstance() throws RouterException { routeIndex ++; instance = new XMLRouter(routeIndex); setDefine( instance ); QueueRouter.put(new java/lang/Long.java.html" target="_blank">Long(routeIndex), instance); return instance; } /** * 清空Hashtable,Vector等 * @roseuid 3F1618B203C1 */ private static void freeResource() throws java/lang/Exception.java.html" target="_blank">Exception { QueuePairFront.clear(); QueuePairBack.clear(); QueueRouter.clear(); QueuePairFront = QueuePairBack = QueueRouter = null; } /** * 消灭实例 * @param instanceID * @throws Exception */ public static void removeInstance(XMLRouter instance) throws java/lang/Exception.java.html" target="_blank">Exception { instance.clear(); QueueRouter.remove( new java/lang/Long.java.html" target="_blank">Long(instance.getIndex() ) ) ; } /** * Method isNull. * @return boolean */ public static boolean isNull() { …… return false; } }
XMLRouter
以下是援用片断:
package com.web.router; import com.web.platform.Exception.RouterException; import com.web.common.*; import java.util.*; import java.lang.reflect.java/lang/reflect/Method.java.html" target="_blank">Method; import java.lang.reflect.java/lang/reflect/Constructor.java.html" target="_blank">Constructor; /** * @author keli * @version 0.0.1 * 平台的症结,路由的类,每一个Router将从RouterFactory里读取 * Router存储的树front,和back,routeIndex,目标是为了能在路由 * 以后能够消灭请求的对象。 * Router能够完成同步和异步的功用. */ public class XMLRouter { /** * Router存储的树front */ private static java/util/Hashtable.java.html" target="_blank">Hashtable QueuePairFront = null; /** * Router存储的树back */ private static java/util/Hashtable.java.html" target="_blank">Hashtable QueuePairBack = null; /** * 本router的index号码 */ private long routeIndex = 0; /** * router的设置 */ private RouterDefine define = null; /** * 用于推断是路由的起回点 */ private java/lang/String.java.html" target="_blank">String action = ""; /** *此变量只是用于在routeto要领中请求新的class */ private java/lang/String.java.html" target="_blank">String classname = ""; /** */ public XMLRouter(long index) { routeIndex = index; } /** * 路由 * @throws Exception * @roseuid 3F1616BD0186 */ public void routing(Env env) throws RouterException, java/lang/Exception.java.html" target="_blank">Exception { /*假如为出发点*/ if( action.equalsIgnoreCase( RouterConstant.CFG_FUNC_ROUTETO ) ) { …… } /*假如为返回点*/ else if( action.equalsIgnoreCase( RouterConstant.CFG_FUNC_ROUTEBACK ) ) { …… } /*否则为毛病*/ else throw new RouterException("Set Router action error."); } /** * 读取本Router的id号. * @return long */ public long getIndex() { return routeIndex; } /** * 消灭一切对象. * @throws RouterException */ public void clear() throws RouterException { QueuePairFront.remove(new java/lang/Long.java.html" target="_blank">Long(routeIndex)); QueuePairBack.remove(new java/lang/Long.java.html" target="_blank">Long(routeIndex)); /*体系接纳*/ java/lang/System.java.html" target="_blank">System.runFinalization(); } /** * 设置本Router的设置. * @param def * @throws RouterException */ public void setDefine(RouterDefine def) throws RouterException { define = def; } /** * 设置action的值 * @param actionName * @throws RouterException */ public void setAction( java/lang/String.java.html" target="_blank">String actionName ) { action = actionName; } }
Service类
以下是援用片断:
package com.web.common; import com.web.platform.Exception.RouterException; /** * Service的父类,abstract */ public abstract class RouteService { /** */ public RouteService() { } /** * routeTo要领,是生意业务的出发点。 * @param env * @throws RouterException */ public abstract void routeto(Env env) throws RouterException; /** * routeBack,生意业务的完毕点, * @param env * @throws RouterException */ public abstract void routeback(Env env) throws RouterException; /** * routeaccept要领,是生意业务的吸收点,也是routeto的吸收函数, * routeaccept为被动生意业务对象的重要处置惩罚函数 * @param env * @throws RouterException */ public abstract void routeaccept(Env env) throws RouterException; /** * routing要领,是Service对外的接口函数 * @throws RouterException */ public abstract void routing() throws RouterException;
接下来则须要完成一切的Services的类了,这里就不做引见了.
六.申明
这个Router到目前为止只能完成同步的生意业务, 临时不支持异步的生意业务,然则因为对Router运用了Composite的形式设想的,完成异步生意业务也是能够扩大的,这里不做详细分析.
以上就是怎样运用XML完成多渠道接入网站的构架的内容,更多相关内容请关注ki4网(www.ki4.cn)!