1. 背景
今日の Web サイトでは、WAP、SMS、EMAIL、従来の Web、Socket など、アクセス チャネルがますます増え、テクノロジーもますます高度になっています。データベースや LDAP も含めれば、アクセスしたがって、新しいチャネルを追加するときに、それ以上のコード変更やさらにはコードの変更が必要ないように、設計内で拡張する必要があるスペースは十分に優れたものでなければなりません。しかし、それは不可能だと思いますが、このマルチチャネルアクセスフレームワークの完璧さをより良く解決する方法はありますか
?
[図 1]
図 1 に示すように、既存のアクセスをすべて使用すると、設計者は目がくらみます。人を集めるためなら、これらのプログラムはどのように書いても実行できます。しかし、維持するのはさらに困難になります。質問に戻りましょう。どうすればより完璧な実装を実現できるでしょうか。図 2 は次のことを示しています。
[図 2]
図 2 は、8 本の爪を持つタコのように見えます。タコの足はすべてのアクセス チャネルに接続されており、これらすべてのチャネルを接続する中心となるのがタコの頭である XMLRouter です。すべてのチャネルと通信し、データ ルーティングとシステム アーキテクチャの拡張性と柔軟性の向上の利点は数多くあります。 XMLRouter と呼ばれる理由は、柔軟で標準化された言語である XML をデータ伝送媒体として使用しないと、ルーターの負荷も飛躍的に増加するためです。XML 仕様を定義すると、将来の拡張に多くのメリットがもたらされます。
3. アイデアとパターン
XMLRouter の元のアイデアは、コンピュータのマザーボードから生まれました。
> ビルダー パターンでは、コンピューターのマザーボードの PCI スロットが PCI 仕様を定義します。作成したカードが PCI 規格を満たしている限り、それが内部でどのように動作するかについては、次のようになります。 Builder パターンは、複雑な構造を分離し、段階的に実装することを提案しています。 XMLRouter は
、これらの複雑なチャネルを分離して
、それらを 1 つずつ実行します。プログラムがサービス仕様に準拠している限り、
ファクトリ モードとコンポジット モードの
XMLRouter は、実際のルータによって生成されます。
RouterFactory を使用すると、送信データ、受信データ、
返信データが
すべてキューから呼び出され、コンポジットモードが適用されます。
ルーターの場合 使用方法は 2 つの部分に分かれています。最初は次のようなルーターの構成です。
ここに引用があります: <サービス> <サービス名="データベース" タイプ="データベース" クラス="com.web.service.DBService"> <コネクタ driver="com.microsoft.jdbc.sqlserver.SQLServerDriver" url="jdbc:microsoft:sqlserver://192.168.0.179:1433" ユーザー="テスト" passwd="テスト" /> サービス> <サービス名="web" type="web" クラス="com.web.service.WebService" > <コネクタ /> サービス> … |
サービス ノードは、アクセスする必要があるチャネルを表します。サブノードの構成は、タイプによって区別されます。データベースの場合は、url、user、passwd、driver などの属性が含まれ、ソケットの場合は、port や maxthread などの属性が含まれます。属性値は独自の定義に従って構成できます。
別のタイプの XML ファイルは
XML トランザクション データ ファイルで、すべてのサービスでデータを転送するために使用されます。各サービスには独自の XML ファイル (webtrans.xml など) が含まれます。
ここに引用があります: <トランザクション> |
対応する dbtrans.xml 形式は次のとおりです。
ここに引用があります: <主キー名="docid" /> <セット> セット> |
XML の残りの部分は、そのようなルールに従ってカスタマイズできます
。 5.
RouterFactory の
技術的実装。ここに引用があります: パッケージcom.web.router; com.web.platform.Exception.RouterException をインポートします。 import java.util.java/util/Hashtable.java.html" target="_blank">Hashtable; |
以下は参照フラグメントです。 /** * ルーターによって生成およびクリアされるクラス */ パブリック クラス RouterFactory { /** * ルーターによって保存されたツリーフロント */ private static java/util/Hashtable.java.html" target="_blank">Hashtable QueuePairFront = null; /** * ルーターによって保存されるツリーバック */ private static java/util/Hashtable.java.html" target="_blank">Hashtable QueuePairBack = null; /** * ルーターによって保存されるツリー */ private static java/util/Hashtable.java.html" target="_blank">Hashtable QueueRouter = null; /** * 返された XMLRouter */ パブリック静的 XMLRouter インスタンス = null; /** *ルーターの定義*/ パブリック静的 RouterDefine ルーター定義 = null; /** *ルーターID番号*/ パブリック静的ロングルートインデックス = 0; /** * @rosuid 3F169C21027C */ パブリック RouterFactory() { } /** * ハッシュテーブルとベクトルの初期化 */ public static void initFactory() は java/lang/Exception.java.html" target="_blank">例外をスローします { 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(); } /** * ルート設定の初期化 * */ private static void initRouteDefine() は java/lang/Exception.java.html" target="_blank">例外をスローします { if(ルーター定義 == null) routerdefine = 新しい RouterDefine(); routerdefine.loadRouterDef(); } /** * インスタンスを返す * @return com.web.router.XMLRouter */ public static XMLRouter getInstance(longindex) が RouterException をスローする { return (XMLRouter)QueueRouter.get(new java/lang/Long.java.html" target="_blank">Long(index)); } /** * XMLRouter のインスタンスを生成します * @return com.web.router.XMLRouter * @rosuid 3F1618A103BC */ public static XMLRouter PopInstance() が RouterException をスローする { ルートインデックス++; インスタンス = 新しい XMLRouter(routeIndex); setDefine( インスタンス ); QueueRouter.put(new java/lang/Long.java.html" target="_blank">Long(routeIndex), インスタンス); インスタンスを返します。 } /** * ハッシュテーブル、ベクターなどをクリア * @roseuid 3F1618B203C1 */ private static void freeResource() は java/lang/Exception.java.html" target="_blank">例外をスローします { QueuePairFront.clear(); QueuePairBack.clear(); QueueRouter.clear(); QueuePairFront = QueuePairBack = QueueRouter = null; } /** * インスタンスをクリア * @param インスタンスID * @throwsException */ public static void deleteInstance(XMLRouter インスタンス) は java/lang/Exception.java.html" target="_blank">例外をスローします { インスタンス.クリア(); QueueRouter.remove( new java/lang/Long.java.html" target="_blank">Long(instance.getIndex() ) ) ; } /** *メソッドはNullです。 * @return ブール値 */ パブリック静的ブール値 isNull() { … false を返します。 } } |
ここに引用があります: パッケージcom.web.router; com.web.platform.Exception.RouterException をインポートします。 com.web.common.* をインポートします。 java.util.* をインポートします。 import java.lang.reflect.java/lang/reflect/Method.java.html" target="_blank">メソッド; import java.lang.reflect.java/lang/reflect/Constructor.java.html" target="_blank">コンストラクター; /** * @著者ケリ * @バージョン0.0.1 * プラットフォームのキー、ルーティング クラス、各ルーターは RouterFactory から読み取ります ※Routerが保存するツリーのfront、back、routeIndexはルーティングを目的としています。 ※適用したオブジェクトは後から消去することも可能です。 * ルーターは同期機能と非同期機能を実装できます。 */ パブリック クラス XMLRouter { /** * ルーターによって保存されたツリーフロント */ private static java/util/Hashtable.java.html" target="_blank">Hashtable QueuePairFront = null; /** * ルーターによって保存されるツリーバック */ private static java/util/Hashtable.java.html" target="_blank">Hashtable QueuePairBack = null; /** * このルーターのインデックス番号 */ プライベートロングルートインデックス = 0; /** *ルーターの設定*/ プライベート RouterDefine 定義 = null; /** * ルートの開始点を決定するために使用されます */ private java/lang/String.java.html" target="_blank">文字列アクション = ""; /** *この変数は、routeto メソッドで新しいクラスを適用する場合にのみ使用されます。 */ private java/lang/String.java.html" target="_blank">String クラス名 = ""; /** */ パブリック XMLRouter(長いインデックス) { ルートインデックス = インデックス; } /** * ルーティング * @throws 例外 * @rosuid 3F1616BD0186 */ public void routing(Env env) が RouterException、java/lang/Exception.java.html" target="_blank">Exception をスローする { /*それが出発点の場合*/ if( action.equalsIgnoreCase( RouterConstant.CFG_FUNC_ROUTETO ) ) { … } /*リターンポイントの場合*/ else if( action.equalsIgnoreCase( RouterConstant.CFG_FUNC_ROUTEBACK ) ) { … } /*それ以外の場合はエラー*/ それ以外 throw new RouterException("ルーター アクションの設定エラー。"); } /** ※本ルーターのID番号を読み取ります。 * @return ロング */ パブリックロングgetIndex() { ルートインデックスを返します。 } /** *すべてのオブジェクトをクリアします。 * @throws RouterException */ public void clear() が 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(); } /** ※本ルーターの設定を行います。 * @param def * @throws RouterException */ public void setDefine(RouterDefine def) は RouterException をスローします { 定義 = 定義; } /** * アクションの値を設定 * @param actionName * @throws RouterException */ public void setAction( java/lang/String.java.html" target="_blank">String actionName ) { アクション = アクション名; } |
サービス
クラス |
ここに引用があります: パッケージcom.web.common; com.web.platform.Exception.RouterException をインポートします。 /** * Service の親クラス、抽象 */ パブリック抽象クラス RouteService { /** */ publicRouteService() { } /** ※routeToメソッドはトランザクションの開始点です。 * @param環境 * @throws RouterException */ public abstract void Routeto(Env env) は RouterException をスローします。 /** *routeBack、トランザクションのエンドポイント、 * @param環境 * @throws RouterException */ public abstract void Routeback(Env env) は RouterException をスローします。 /** ※routeacceptメソッドはトランザクションの受信点であり、routetoの受信関数です。 * Routeaccept はパッシブトランザクションオブジェクトの主要な処理関数です * @param env * @throws RouterException */ public abstract void Routeaccept(Env env) は RouterException をスローします。 /** * ルーティングメソッドはServiceの外部インターフェース関数 * @throws RouterException */ public abstract void routing() throws RouterException; |
次に、ここでは紹介しませんが、すべての Services クラスを実装する必要があります。
6.
この Router は現時点では同期トランザクションのみを実装できること
を説明します。ただし、Router は Composite モデルを使用して設計されているため、非同期トランザクションの実装も拡張できるため、ここでは詳細な分析は行いません。