`
kaminlee
  • 浏览: 260793 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

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

}

 

分享到:
评论

相关推荐

    swift-Locatable是一个Swift微框架它利用PropertyWrappers通过自定义属性@Locatable实现ServiceLocator模式

    Locatable是一个Swift微框架,它利用Property Wrappers通过自定义属性@Locatable实现Service Locator模式

    用Java实现23种设计模式

    用Java实现23种设计模式 1. 创建型模式 工厂模式(Factory Pattern) ... 服务定位器模式(Service Locator Pattern) 传输对象模式(Transfer Object Pattern) 生产者消费者模式(Producer Consumer Pattern)

    实用J2EE设计模式编程指南

    Service Locator模式 使用持久性框架 持久性框架策略 小结 第4章 改进性能与伸缩性的设计模式 性能问题的原因 伸缩性问题的原因 城市休假订票应用程序 标识提高性能的模式 标识提高伸缩性的模式 完整City Break...

    论文研究-网络流量分析系统的设计与实现.pdf

    面向插件的应用框架具有易于复用和动态...通过一个实例介绍了如何改进Service Locator模式使之更好地管理大量的细粒度短生命周期的插件对象,并展示了采用改进的Service Locator模式来设计面向插件的应用框架的方法。

    ts-service-locator

    例如,假设您有一个使用logger服务的组件,该组件负责将日志发送到您的后端服务,然后该服务将日志消息存储在数据库中。 在单元测试中,您不希望您的组件实际对后端进行网络调用。 // logger.tsimport axios from ...

    ASP.NET设计模式-杨明军译(源码)

    8.1.2 Service Locator 8.1.3 IoC容器 8.1.4 StructureMap 8.2 Model-View-Presenter 8.3 Front Controller 8.3.1 Command模式 8.3.2 Chain of Responsibility模式 8.4 Model-View-Controller 8.4.1 ...

    Java Service Locator Information Manager-开源

    “ Java服务定位器信息管理器”(JSlim)是一个描述符文档,有助于实现核心J2EE服务定位器模式。 最重要的是,它通过模拟对象替换实现了容器外的测试。

    二十三种设计模式【PDF版】

    整个设计模式贯穿一个原理:面对接口编程,而不是面对实现.目标原则是:降低耦合,增强灵活性. 建筑和软件中模式之异同 CSDN 的透明特别推崇《建筑的永恒之道》,认为从中探寻到软件的永恒之道,并就"设计模式"写了专门...

    Spring中文开发指南

    例如:Factory、Abstract Factory、Builder、Decorator 和 Service Locator 这些模式(列举的只是少数)在软件开发行业被普遍认可和肯定(或许这就是为什么这些模式被定型的原因)。 这固然是件好事,不过这些模式...

    Spring Framework 开发参考手册

    例如:Factory、Abstract Factory、Builder、Decorator 和 Service Locator 这些模式(列举的只是少数)在软件开发行业被普遍认可和肯定(或许这就是为什么这些模式被定型的原因)。 这固然是件好事,不过这些模式...

    cucumber-hk2

    该ServiceLocator模块使用由用户实施提供ServiceLocatorSource 。 通过将环境密钥hk2.locator-source设置为实现类的完全限定名称,将实现公开到Cucumber运行时。 最简单的方法是通过使用配置值创建一个cumcuming....

    个人集成平台

    使用的东西包括,“Bootstrapper”,“ServiceLocator”,还有“Modularity”,而且我只是借用了他们的思想,然后进行了轻量级的实现。特别是其中的“Modularity”部分,我使用了微软推出的MEF架构进行了简单的实现...

    Windows系统进程详解

    或多个从注册表值中选取的服务名,这个服务的参数值包含了一个ServiceDLL值。 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Service explorer.exe 资源管理器 (internat.exe 托盘区的拼音图标) 就像...

    flex3的cookbook书籍完整版dpf(包含目录)

    创建CairngormFrontController和ServiceLocator 21.8节.使用Cairngorm框架生成器生成应用程序骨架 21.9节.学习常用的提高性能的技巧 21.10节.在组件中创建元数据 第二十二章.模块(Modules)和运行时共享库(RSLs)(669)...

Global site tag (gtag.js) - Google Analytics