首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web前端 >

一个ServiceLocator方式的实现

2013-03-17 
一个ServiceLocator模式的实现import javax.naming.*import javax.naming.NamingExceptionimport javax.

一个ServiceLocator模式的实现

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());    }  }}

?

热点排行