1. Contexte
Dans les sites Web d'aujourd'hui, les canaux d'accès sont de plus en plus nombreux et la technologie est de plus en plus avancée, comme le WAP, le SMS, l'EMAIL, le Web traditionnel, Socket, etc. même la base de données et LDAP sont considérés comme connectés, alors l'espace qui doit être étendu dans la conception doit être très bon pour garantir que lors de l'ajout de nouveaux canaux, il n'est pas nécessaire de modifier davantage le code ou même de changer le code du tout . Mais est-ce possible ? Je ne pense pas que ce soit possible, mais existe-t-il un moyen de mieux résoudre la perfection de ce cadre d'accès multicanal ?
2.
【Image 1】
Comme le montre la figure 1, lorsque tous les accès existants ont été utilisés, les concepteurs sont éblouis. Si c'est pour obtenir une part, vous pouvez écrire ces programmes dedans. de toute façon, et ils peuvent certainement être mis en œuvre, mais ce sera plus pénible à maintenir. Revenons à la question, comment pouvons-nous atteindre plus de perfection comme le montre la figure 2 : [Image 2]L'image 2 ressemble à une pieuvre à huit griffes. Les pattes de la pieuvre sont respectivement connectées à tous les canaux d'accès. Le cœur de la connexion de tous ces canaux est la tête de pieuvre xmlRouter. L'objectif du routeur est ici de communiquer sur tous les canaux, de mettre en œuvre le routage des données et d'améliorer l'évolutivité et la flexibilité de l'architecture du système. Les avantages seront nombreux. Il est appelé XMLRouter car si XML, un langage flexible et standardisé, n'est pas utilisé comme support de transmission de données, la charge de travail du routeur augmentera également de façon exponentielle. La définition de la spécification XML entraînera une expansion future.
3. Idées et modèles
L'idée originale de XMLRouter est venue du modèle Builder de la carte mère de l'ordinateur et . Tant que la carte que vous produisez est conforme à la norme PCI, vous pouvez alors la brancher sur la carte mère et elle fonctionnera. Quant à son fonctionnement intérieur, il a été encapsulé. Le Builder Pattern propose de séparer la construction complexe et de la mettre en œuvre. étape par étape. .XMLRouter sépare ces canaux complexes et les exécute un par un
Idée de services : Afin de communiquer avec le routeur, une interface unifiée doit être définie lors de l'accès à ces canaux, appelée Services. tant que le programme est conforme à la spécification des services, il peut accéder aux données du routeur et du routage
Mode usine et mode composite
XMLRouter sera généré en utilisant le mode Usine dans la conception réelle, et le routeur est généré par RouterFactory Production, une fois mis en service, sera placé dans la file d'attente. Le routeur correspondant pour transmettre des données, recevoir des données et renvoyer des données est appelé depuis la file d'attente et le mode composite est appliqué
<.> 4. Fichier de configuration XML Le fichier XML est divisé en deux parties pour une utilisation dans le Routeur La première est la configuration du Routeur, telle que :Ce qui suit est un fragment de référence :
Il s'agit du fichier de configuration du routeur. Le nœud de service représente le canal auquel il faut accéder. Le nœud de service contient des sous-nœuds de connecteur. La configuration des sous-nœuds est distinguée selon le type. Si c'est le cas, la base de données contient des attributs tels que l'URL, l'utilisateur, le mot de passe, le pilote, etc. S'il s'agit d'un socket, il contient des attributs tels que port, maxthread, etc. Les valeurs d'attributpeuvent être configurées selon votre propre définition
<?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>
Ce qui suit est un fragment de référence :
Le format dbtrans.xml correspondant est le suivant
<?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>
Ce qui suit est un fragment de citation:
<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>
5. Implémentation technique
Ce qui suit est un fragment de citation :
🎜>
Ce qui suit sont des fragments de citation :
package com.web.router; import com.web.platform.Exception.RouterException; import java.util.java/util/Hashtable.java.html" target="_blank">Hashtable;
Ce qui suit est un fragment de citation :
/** * 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; } }
Classe de service
ci-dessous Il s'agit d'un fragment de citation :
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; } }
Ensuite, vous devez mettre en œuvre toutes les classes de services, qui ne seront pas présentées ici.
Ce routeur ne peut jusqu'à présent implémenter que des transactions synchrones et ne prend pas en charge les transactions asynchrones pour le moment. Étant donné que le routeur est conçu à l'aide du modèle composite, les transactions asynchrones peuvent également être étendues. Ce n'est pas le cas ici
Ce qui précède explique comment utiliser XML pour obtenir un mode multicanal. accès à la structure du site Web Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (www.php.cn) !