一个ServiceLocator模式的实现

    xiaoxiao2024-03-18  12

    废话不说,代码说话:

    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());    }  }} 文章转自庄周梦蝶  ,原文发布5.16 相关资源:敏捷开发V1.0.pptx
    最新回复(0)