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

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值