1. Hintergrund
Auf heutigen Websites gibt es immer mehr Zugriffskanäle und die Technologie wird immer fortschrittlicher, z. B. WAP, SMS, E-Mail, herkömmliches Web, Socket usw. Wenn sogar Datenbanken und LDAP enthalten sind, greifen Sie auf If zu Daher muss der Platz, der im Design erweitert werden muss, sehr groß sein, um sicherzustellen, dass beim Hinzufügen neuer Kanäle keine Codemodifikationen oder sogar Codeänderungen mehr erforderlich sind. Aber ist es möglich? Ich glaube nicht, dass es möglich ist, aber gibt es eine Möglichkeit, die Perfektion dieses Mehrkanal-Zugriffs-Frameworks zu erreichen
?
[Abbildung 1]
Wie in Abbildung 1 gezeigt, sind Designer erstaunt, wenn sie alle vorhandenen Zugriffe nutzen. Wenn es darum geht, Menschen zu versammeln, können diese Programme auf beliebige Weise geschrieben werden, und es wird definitiv funktionieren , aber es wird schwieriger sein, auf die Frage zurückzukommen, wie wir eine perfektere Implementierung erreichen können.
[Abbildung 2]
Abbildung 2 sieht aus wie ein Oktopus mit acht Krallen. Der Kern der Verbindung aller dieser Kanäle ist der XMLRouter. Die Rolle des Oktopus besteht darin Kommunizieren Sie mit allen Kanälen und erkennen Sie die Vorteile der Datenweiterleitung und der Verbesserung der Skalierbarkeit und Flexibilität der Systemarchitektur. Es heißt XMLRouter, denn wenn XML, eine flexible und standardisierte Sprache, nicht als Datenübertragungsmedium verwendet wird, wird auch die Arbeitsbelastung des Routers exponentiell ansteigen. Die Definition der XML-Spezifikation bringt viele Vorteile mit sich.
3. Ideen und Muster
Die ursprüngliche Idee von XMLRouter kam vom Motherboard des Computers und <
>Im Builder-Muster definiert der PCI-Steckplatz des Computer-Motherboards die PCI-Spezifikation. Solange die von Ihnen hergestellte Karte dem PCI-Standard entspricht, kann sie funktionieren, wenn Sie sie in das Motherboard einsetzen Builder Pattern schlägt vor, diese komplexen Kanäle zu trennen und schrittweise zu implementieren:
Um mit dem Router zu kommunizieren, muss beim Zugriff eine einheitliche Schnittstelle definiert werden Der Kanal wird hier als Dienste bezeichnet und kann
auf denFactory-Modus und den Composite-Router-
Router zugreifen, der im tatsächlichen Design erstellt wird RouterFactory wird bei der Verwendung in die Warteschlange gestellt. Die Übertragungsdaten, Empfangsdaten und Rückgabedaten werden alle vom entsprechenden Router aus der Warteschlange abgerufen und der Composite-Modus angewendet.
4.XML
-Konfigurationsdatei
für Router Die Verwendung ist in zwei Teile unterteilt. Der erste ist die Konfiguration des Routers, wie zum Beispiel:
Hier ein Zitat: <?xml version="1.0" ?> <Dienste> <!--Datenbankdienst --> <service name="database" type="database" class="com.web.service.DBService"> <Anschluss Driver="com.microsoft.jdbc.sqlserver.SQLServerDriver" url="jdbc:microsoft:sqlserver://192.168.0.179:1433" user="test" passwd="test" /> </service> <!-- Webdienst--> <service name="web" type="web" class="com.web.service.WebService" > <connector /> </service> … </services> |
Dies ist die Konfigurationsdatei des Routers. Der Dienstknoten stellt den Kanal dar, auf den zugegriffen werden muss. Die Konfiguration des Unterknotens wird unterschieden Eine Datenbank enthält Attribute wie URL, Benutzer, Passwort, Treiber usw. Wenn es sich um einen Socket handelt, enthält er Attribute wie Port und Maxthread. Die Attributwerte können gemäß Ihrer eigenen Definition konfiguriert werden .
Eine andere Art von XML-Datei ist die XML-Transaktionsdatendatei, die zur Datenübertragung in allen Diensten verwendet wird. Die entsprechende XML-Datei, z. B. webtrans.xml, hat das folgende Format:
Hier ein Zitat: <?xml version="1.0" ?> <Transaktion> <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> |
Das entsprechende dbtrans.xml-Format lautet wie folgt
Hier ein Zitat: <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> |
Der Rest des XML kann gemäß diesen Regeln angepasst werden
. 5. Technische Implementierung
von RouterFactory
Hier ein Zitat: Paket com.web.router; import com.web.platform.Exception.RouterException; import java.util.java/util/Hashtable.java.html" target="_blank">Hashtable; |
Das Folgende ist ein Referenzfragment: /** * Vom Router generierte und gelöschte Klassen */ öffentliche Klasse RouterFactory { /** * Baumfront vom Router gespeichert */ private static java/util/Hashtable.java.html" target="_blank">Hashtable QueuePairFront = null; /** * Vom Router gespeicherter Baum */ private static java/util/Hashtable.java.html" target="_blank">Hashtable QueuePairBack = null; /** * Vom Router gespeicherter Baum */ private static java/util/Hashtable.java.html" target="_blank">Hashtable QueueRouter = null; /** * XMLRouter zurückgegeben */ öffentliche statische XMLRouter-Instanz = null; /** *Definition von Router */ öffentliches statisches RouterDefine routerdefine = null; /** * Router-ID-Nummer */ öffentlicher statischer langer RouteIndex = 0; /** * @roseuid 3F169C21027C */ öffentliche RouterFactory() { } /** * Hashtable und Vector initialisieren */ public static void initFactory() löst eine java/lang/Exception.java.html" target="_blank">Exception aus { 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(); } /** * Routeneinstellungen initialisieren * */ private static void initRouteDefine() löst eine java/lang/Exception.java.html" target="_blank">Exception aus { if(routerdefine == null) routerdefine = new RouterDefine(); routerdefine.loadRouterDef(); } /** * Instanz zurückgeben * @return com.web.router.XMLRouter */ public static XMLRouter getInstance(long index) löst eine RouterException aus { return (XMLRouter)QueueRouter.get(new java/lang/Long.java.html" target="_blank">Long(index)); } /** * Generieren Sie eine Instanz von XMLRouter. * @return com.web.router.XMLRouter * @roseuid 3F1618A103BC */ public static XMLRouter popInstance() löst eine RouterException aus { routeIndex++; Instanz = neuer XMLRouter(routeIndex); setDefine( Instanz ); QueueRouter.put(new java/lang/Long.java.html" target="_blank">Long(routeIndex), Instanz); Rückgabeinstanz; } /** * Hashtabelle, Vektor usw. löschen. * @roseuid 3F1618B203C1 */ private static void freeResource() löst eine java/lang/Exception.java.html" target="_blank">Exception aus { QueuePairFront.clear(); QueuePairBack.clear(); QueueRouter.clear(); QueuePairFront = QueuePairBack = QueueRouter = null; } /** * Instanz löschen * @param Instanz-ID * @throwsException */ public static void removeInstance(XMLRouter-Instanz) löst eine java/lang/Exception.java.html" target="_blank">Exception aus { Instanz.clear(); QueueRouter.remove( new java/lang/Long.java.html" target="_blank">Long(instance.getIndex() ) ) ; } /** * Methode ist Null. * @return boolean */ öffentlicher statischer boolescher Wert isNull() { … return false; } } |
Hier ein Zitat: Paket 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">Methode; import java.lang.reflect.java/lang/reflect/Constructor.java.html" target="_blank">Constructor; /** * @author keli * @Version 0.0.1 * Den Schlüssel zur Plattform, die Routing-Klasse, liest jeder Router aus RouterFactory * Der vom Router gespeicherte Baum-Front-, Back- und RouteIndex dient dem Routing * Die angewendeten Objekte können später gelöscht werden. * Router kann synchrone und asynchrone Funktionen implementieren. */ öffentliche Klasse XMLRouter { /** * Baumfront vom Router gespeichert */ private static java/util/Hashtable.java.html" target="_blank">Hashtable QueuePairFront = null; /** * Vom Router gespeicherter Baum */ private static java/util/Hashtable.java.html" target="_blank">Hashtable QueuePairBack = null; /** * Die Indexnummer dieses Routers */ private lange RouteIndex = 0; /** * Router-Einstellungen */ private RouterDefine define = null; /** * Wird verwendet, um den Startpunkt der Route zu bestimmen */ private java/lang/String.java.html" target="_blank">String action = ""; /** *Diese Variable wird nur verwendet, um eine neue Klasse in der Routeto-Methode anzuwenden */ private java/lang/String.java.html" target="_blank">String classname = ""; /** */ öffentlicher XMLRouter (langer Index) { routeIndex = index; } /** * Routing * @throws-Ausnahme * @roseuid 3F1616BD0186 */ public void Routing(Env env) löst eine RouterException aus, java/lang/Exception.java.html" target="_blank">Exception { /*Wenn es der Ausgangspunkt ist*/ if( action.equalsIgnoreCase( RouterConstant.CFG_FUNC_ROUTETO ) ) { … } /*Wenn es ein Rückgabepunkt ist*/ else if( action.equalsIgnoreCase( RouterConstant.CFG_FUNC_ROUTEBACK ) ) { … } /*Sonst handelt es sich um einen Fehler*/ anders throw new RouterException("Router-Aktionsfehler festlegen."); } /** * Lesen Sie die ID-Nummer dieses Routers. * @return long */ public long getIndex() { return routeIndex; } /** * Löschen Sie alle Objekte. * @throws RouterException */ public void clear() löst eine RouterException aus { QueuePairFront.remove(new java/lang/Long.java.html" target="_blank">Long(routeIndex)); QueuePairBack.remove(new java/lang/Long.java.html" target="_blank">Long(routeIndex)); /*Systemrecycling*/ java/lang/System.java.html" target="_blank">System.runFinalization(); } /** * Legen Sie die Einstellungen dieses Routers fest. * @param def * @throws RouterException */ public void setDefine(RouterDefine def) löst eine RouterException aus { define = def; } /** * Legen Sie den Wert der Aktion fest * @param actionName * @throws RouterException */ public void setAction( java/lang/String.java.html" target="_blank">String actionName ) { action = actionName; } } |
Serviceklasse
Hier ein Zitat: Paket com.web.common; import com.web.platform.Exception.RouterException; /** * Die übergeordnete Klasse von Service, abstrakt */ öffentliche abstrakte Klasse RouteService { /** */ publicRouteService() { } /** * Die RouteTo-Methode ist der Ausgangspunkt der Transaktion. * @param env * @throws RouterException */ public abstract void routeto(Env env) löst eine RouterException aus; /** *routeBack, der Endpunkt der Transaktion, * @param env * @throws RouterException */ public abstract void routeback(Env env) löst eine RouterException aus; /** * Die Routeaccept-Methode ist der Empfangspunkt der Transaktion und die Empfangsfunktion von Routeto. * Routeaccept ist die Hauptverarbeitungsfunktion passiver Transaktionsobjekte * @param env * @throws RouterException */ public abstract void routeaccept(Env env) löst RouterException aus; /** * Die Routing-Methode ist die externe Schnittstellenfunktion des Dienstes * @throws RouterException */ public abstract void Routing() löst RouterException aus; |
Als nächstes müssen Sie alle Services-Klassen implementieren, die hier nicht vorgestellt werden.
6. Erklären Sie, dass
dieser Router bisher nur synchrone Transaktionen implementieren kann und vorerst keine asynchronen Transaktionen unterstützt Da der Router jedoch auf dem Composite-Modell basiert, kann auch die Implementierung asynchroner Transaktionen erweitert werden, sodass hier keine detaillierte Analyse durchgeführt wird.