莊周夢蝶

          生活、程序、未來
             :: 首頁 ::  ::  :: 聚合  :: 管理

          一個ServiceLocator模式的實現

          Posted on 2007-02-06 11:49 dennis 閱讀(3400) 評論(0)  編輯  收藏 所屬分類: 模式與架構
          ?廢話不說,代碼說話:
          import?javax.naming.*;
          import?javax.naming.NamingException;
          import?javax.rmi.PortableRemoteObject;
          import?javax.ejb.EJBHome;
          import?javax.ejb.EJBLocalHome;
          import?javax.sql.DataSource;
          import?java.util.*;
          import?java.sql.*;

          /**
          ?*??實現?service?locater?模式,用于由客戶端來調用以通過JNDI查
          ?*??找相關的?ejb或是其它服務的入口.
          ?*?
          */

          public?final?class?ServiceLocater?{

          ??
          protected?static?ServiceLocater?inst?=?new?ServiceLocater();
          ??
          private?InitialContext?ic?=?null;
          ??
          private?Map?ejbHomeCache?=?null;
          ??
          private?Map?dataSourceCache?=?null;
          ??
          protected?ServiceLocater()?{
          ????
          try?{
          ??????dataSourceCache?
          =?Collections.synchronizedMap(new?HashMap());
          ??????ejbHomeCache?
          =?Collections.synchronizedMap(new?HashMap());
          ??????ic?
          =?new?InitialContext();
          ????}

          ????
          catch?(Exception?e)?{
          ??????e.printStackTrace();
          ????}

          ??}


          ??
          /**
          ???*?取得?servicelocater的單子實例.
          ???*?
          */

          ??
          synchronized?public?static?ServiceLocater?getInstance()?{
          ????
          return?inst;
          ??}


          ??
          /**
          ???*查找并返回一個數據源
          ???*?
          @param?name?String?數據源名稱
          ???*?
          @return?DataSource ,查找不到則拋出異常.
          ???*?
          @throws?NamingException?,查找不到或是類型不對。
          ???*?
          */

          ??
          private?DataSource?lookUpDataSource(String?name)?throws?NamingException?{
          ????DataSource?tmpDS?
          =?(DataSource)this.dataSourceCache.get(name);
          ????
          if?(tmpDS?==?null)?{
          ??????
          try?{
          ????????tmpDS?
          =?(DataSource)this.ic.lookup(name);
          ????????
          this.dataSourceCache.put(name,?tmpDS);
          ??????}

          ??????
          catch?(NamingException?namE)?{
          ????????
          throw?namE;
          ??????}

          ??????
          catch?(Exception?otherE)?{
          ????????
          throw?new?NamingException(otherE.getMessage());
          ??????}

          ????}

          ????
          return?tmpDS;
          ??}


          ??
          /**
          ???*?查找并返回一個遠程接口
          ???*?
          @param?jndiHomeName?ebj名字
          ???*?
          @param?className??ejb類名字
          ???*?
          @return
          ???*?
          @throws?ServiceLocatorException
          ???
          */

          ??
          public?EJBHome?getRemoteHome(String?jndiHomeName,?Class?className)?throws
          ??????ServiceLocatorException?
          {
          ????EJBHome?home?
          =?(EJBHome)this.ejbHomeCache.get(jndiHomeName);
          ????
          if?(home?==?null)?{
          ??????
          try?{
          ????????Object?objref?
          =?ic.lookup(jndiHomeName);
          ????????Object?obj?
          =?PortableRemoteObject.narrow(objref,?className);
          ????????home?
          =?(EJBHome)?obj;
          ????????
          this.ejbHomeCache.put(jndiHomeName,?home);
          ??????}

          ??????
          catch?(NamingException?ne)?{
          ????????
          throw?new?ServiceLocatorException(ne);
          ??????}

          ??????
          catch?(Exception?e)?{
          ????????
          throw?new?ServiceLocatorException(e);
          ??????}

          ????}

          ????
          return?home;
          ??}


          ??
          /**
          ???*?查找并返回一個本地接口
          ???*?
          @param?jndiHomeName??jndiHomeName名字
          ???*?
          @return?一個本地接口
          ???*?
          @throws?ServiceLocatorException
          ???
          */

          ??
          public?EJBLocalHome?getLocalHome(String?jndiHomeName)?throws
          ??????ServiceLocatorException?
          {
          ????EJBLocalHome?home?
          =?null;
          ????
          try?{
          ??????home?
          =?(EJBLocalHome)?ic.lookup(jndiHomeName);
          ????}

          ????
          catch?(NamingException?ne)?{
          ??????
          throw?new?ServiceLocatorException(ne);
          ????}

          ????
          catch?(Exception?e)?{
          ??????
          throw?new?ServiceLocatorException(e);
          ????}

          ????
          return?home;

          ??}


          ??
          /**
          ???*查找一個數據源,并取得一個連接.
          ???*?
          @param?name?String?數據源名稱
          ???*?
          @return?DataSource ,查找不到則拋出異常.
          ???*?
          @throws?NamingException?,查找不到或是類型不對。
          ???*?
          */

          ??
          public?Connection?getConnection(String?DataSourceJNDIName)?throws
          ??????SQLException?
          {
          ????
          try?{
          ??????Connection?conn?
          =?this.lookUpDataSource(DataSourceJNDIName).getConnection();
          ??????conn.setAutoCommit(
          false);
          ??????
          //conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
          ??????return?conn;
          ????}

          ????
          catch?(Exception?e)?{
          ??????e.printStackTrace();
          ??????
          throw?new?SQLException(e.getMessage());
          ????}

          ??}


          }
          主站蜘蛛池模板: 淮滨县| 托克逊县| 东港市| 墨竹工卡县| 南京市| 汉沽区| 乐昌市| 信宜市| 堆龙德庆县| 朝阳市| 安平县| 岫岩| 屯留县| 常熟市| 林甸县| 沂南县| 莱芜市| 化德县| 高雄市| 安西县| 博白县| 长岛县| 肥乡县| 荣昌县| 荔浦县| 容城县| 望谟县| 左权县| 进贤县| 乐都县| 平和县| 惠水县| 襄汾县| 玉山县| 华蓥市| 苗栗市| 定南县| 新余市| 徐州市| 萍乡市| 东阳市|