一個ServiceLocator模式的實(shí)現(xiàn)
Posted on 2007-02-06 11:49 dennis 閱讀(3400) 評論(0) 編輯 收藏 所屬分類: 模式與架構(gòu)?廢話不說,代碼說話:
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.*;


/**?*//**
?*??實(shí)現(xiàn)?service?locater?模式,用于由客戶端來調(diào)用以通過JNDI查
?*??找相關(guān)的?ejb或是其它服務(wù)的入口.
?*?*/

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的單子實(shí)例.
???*?*/

??synchronized?public?static?ServiceLocater?getInstance()?
{
????return?inst;
??}


??/**?*//**
???*查找并返回一個數(shù)據(jù)源
???*?@param?name?String?數(shù)據(jù)源名稱
???*?@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;
??}


??/**?*//**
???*?查找并返回一個遠(yuǎn)程接口
???*?@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;

??}


??/**?*//**
???*查找一個數(shù)據(jù)源,并取得一個連接.
???*?@param?name?String?數(shù)據(jù)源名稱
???*?@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());
????}
??}

}



















































































































































































