莊周夢蝶

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

          一個ServiceLocator模式的實(shí)現(xiàn)

          Posted on 2007-02-06 11:49 dennis 閱讀(3400) 評論(0)  編輯  收藏 所屬分類: 模式與架構(gòu)
          ?廢話不說,代碼說話:
          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.*;

          /**
          ?*??實(shí)現(xiàn)?service?locater?模式,用于由客戶端來調(diào)用以通過JNDI查
          ?*??找相關(guān)的?ejb或是其它服務(wù)的入口.
          ?*?
          */

          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的單子實(shí)例.
          ???*?
          */

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


          ??
          /**
          ???*查找并返回一個數(shù)據(jù)源
          ???*?
          @param?name?String?數(shù)據(jù)源名稱
          ???*?
          @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;
          ??}


          ??
          /**
          ???*?查找并返回一個遠(yuǎn)程接口
          ???*?
          @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;

          ??}


          ??
          /**
          ???*查找一個數(shù)據(jù)源,并取得一個連接.
          ???*?
          @param?name?String?數(shù)據(jù)源名稱
          ???*?
          @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());
          ????}

          ??}


          }
          主站蜘蛛池模板: 玉屏| 阿拉尔市| 关岭| 河津市| 老河口市| 韩城市| 安福县| 安岳县| 门头沟区| 定州市| 偃师市| 溆浦县| 板桥市| 中西区| 石嘴山市| 汽车| 竹北市| 西安市| 剑川县| 颍上县| 和龙市| 河津市| 年辖:市辖区| 锦州市| 望谟县| 齐河县| 探索| 四会市| 忻州市| 天柱县| 泗洪县| 灵川县| 青龙| 蓬莱市| 文山县| 湟源县| 井冈山市| 荥经县| 商丘市| 苍溪县| 正安县|