庄周梦蝶

生活、程序、未来
   :: 首页 ::  ::  :: 聚合  :: 管理

一个ServiceLocator模式的实现

Posted on 2007-02-06 11:49 dennis 阅读(3391) 评论(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());
    }

  }


}

只有注册用户登录后才能发表评论。


网站导航: