溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用XML實現(xiàn)多渠道接入網(wǎng)站構架的方法

發(fā)布時間:2020-08-21 11:25:58 來源:億速云 閱讀:181 作者:小新 欄目:編程語言

小編給大家分享一下使用XML實現(xiàn)多渠道接入網(wǎng)站構架的方法,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

一.背景

  在現(xiàn)在的網(wǎng)站中,接入的渠道是越來越多了,技術也是越來越先進,WAP, SMS,EMAIL, 傳統(tǒng)的Web, Socket等等,如果連數(shù)據(jù)庫和LDAP也算接入的話,那在設計之中需要擴展的空間要做到很好 很好,才保證在添加新的渠道情況下不需要更多的修改代碼甚至不改代碼的情況。但可能嗎?我想也不可能,但有什么方式可以更好的解決這種多渠道接入的框架的完美性呢?

二.構架

使用XML實現(xiàn)多渠道接入網(wǎng)站構架的方法

 【圖一】

 如圖一所顯示,在現(xiàn)有的所有接入都已經(jīng)使用上的時候,設計者看的都眼花繚亂了,如果是為了湊份子,那這些程序怎么寫都可以,而且也肯定可以實現(xiàn),但維護起來就會比較痛苦,還是回到那個問題,怎么可以實現(xiàn)更完美呢?如圖二顯示:

使用XML實現(xiàn)多渠道接入網(wǎng)站構架的方法

【圖二】

 圖二看起來象個八爪的章魚,章魚腿分別連接所有的接入渠道,進行連接所有這些渠道的核心就是這個章魚的頭xmlRouter,Router在此的作用是溝通所有渠道,實現(xiàn)數(shù)據(jù)的路由,爭強系統(tǒng)在構架上的擴展性和靈活性,好處會很多很多。稱呼為XMLRouter是因為如果不使用XML這種靈活而又規(guī)范的語言來做為數(shù)據(jù)傳輸?shù)拿浇?那Router的工作量也同樣會成倍的增加,定義好XML的規(guī)范后將為以后的擴展帶來很多好處。

  三.思想和模式

  XMLRouter的最初想法來自于計算機的主板和<>之中的Builder Pattern, 計算機主板的PCI 插槽定義了PCI的規(guī)范,只要你生產(chǎn)的卡符合PCI標準,那你插入到這個主板上就可以工作, 至于里面是怎么工作的則是已經(jīng)封裝好了. Builder Pattern則是提出將復雜的構建分離開來, 一步一步的進行實現(xiàn).XMLRouter是將這些復雜的渠道分離開來,一個個的進行表現(xiàn).

  Services思想:為了能和Router進行溝通,在這些渠道接入時必須定義統(tǒng)一的接口,這里成為Services, 只要符合Services規(guī)范的程序就可以接入到Router并進行數(shù)據(jù)的路由.

  Factory模式和Composite模式

  XMLRouter在實際的設計中將采用Factory模式產(chǎn)生,Router由RouterFactory生產(chǎn), 在投入使用時將放置于隊列中,傳遞數(shù)據(jù)和接收數(shù)據(jù)以及返回數(shù)據(jù)都從隊列中取相應的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節(jié)點代表需要接入的渠道, service節(jié)點包含connector子節(jié)點, 子節(jié)點的配置根據(jù)type來區(qū)分, 如果是database則包含url, user, passwd,driver等屬性, 如果是socket則包含 port, maxthread等屬性, 屬性值可以根據(jù)自己的定義來配置.

  另一種XML文件則是XML交易數(shù)據(jù)文件,用于在所有的services中傳遞數(shù)據(jù),每個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則可按這樣的規(guī)則來定制

  五.技術實現(xiàn)

  RouterFactory

以下是引用片段:

package com.web.router; 
import com.web.platform.Exception.RouterException; 
import java.util.java/util/Hashtable.java.html" target="_blank">Hashtable;

以下是引用片段:

/** 
 * Router產(chǎn)生和清除的類 
 */ 
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)); 
  }  
  /** 
   * 產(chǎn)生一個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可以實現(xiàn)同步和異步的功能. 
 */ 
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)); 
     /*系統(tǒng)回收*/ 
     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的接收函數(shù), 
   * routeaccept為被動交易對象的主要處理函數(shù) 
   * @param env 
   * @throws RouterException 
   */ 
  public abstract void routeaccept(Env env) throws RouterException;   
  /** 
   * routing方法,是Service對外的接口函數(shù) 
   * @throws RouterException 
   */ 
  public abstract void routing() throws RouterException;

  接下來則需要實現(xiàn)所有的Services的類了,這里就不做介紹了.

  六.說明

  這個Router到目前為止只能實現(xiàn)同步的交易, 暫時不支持異步的交易,但是由于對Router使用了Composite的模式設計的,實現(xiàn)異步交易也是可以擴展的,這里不做詳細分析.

以上是使用XML實現(xiàn)多渠道接入網(wǎng)站構架的方法的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

xml
AI