庄周梦蝶
生活、程序、未来
::
首页
:: :: ::
聚合
::
管理
一个ServiceLocator模式的实现
Posted on 2007-02-06 11:49
dennis
阅读(3389)
评论(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());
}
}
}
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
知识库
C++博客
博问
管理
相关文章:
如何熟悉一个开源项目?
写DSL的步骤
做基础产品的体会
Push or pull?
SEDA架构笔记
代码自我审查的一些体会
Yanf4j设计的两张图片
《Unix编程艺术》重读笔记(三)
《Unix编程艺术》重读笔记(二)
《Unix编程艺术》重读笔记(一)
Powered by:
BlogJava
Copyright © dennis
公告
关于我
随笔分类
Android相关
C#历程(13)
Clojure(43)
erlang(16)
Hadoop与分布式(16)
java(176)
linux & C(25)
my open-source(100)
node.js(5)
unix网络编程(6)
web开发(13)
动态语言(81)
小毅同学二三事(1)
工作流(5)
工作随笔(9)
工具和命令(4)
数据库技术(14)
数据结构与算法(26)
模式与架构(30)
涂鸦(141)
源码解读(28)
移动开发(1)
计算机科学与基础(56)
软件工程(6)
友情链接
About me
Clojure中文技术社区
xmemcached
多背一公斤
梦想风暴
淘宝Java中间件
美味书签
美味书签团队博客
美味爱读
邢红瑞的blog
阿宝的blog
阿欢的blog
最新随笔
1. 博客搬迁
2. Another URL Shortener using NodeJS
3. Clojure中文专业技术社区
4. Ring.velocity:render velocity templates for ring in clojure
5. Clojure笔记:用好type hint
6. Clojure世界:利用HouseMD诊断clojure
7. 分布式消息中间件Metaq发布1.4.3
8. 如何熟悉一个开源项目?
9. Emacs + Clojure配置的几个Tip
10. clj.monitor : monitoring applications in clojure based on SSH
搜索
最新评论
1. vitamind28448
评论内容较长,点击标题查看
--Good post. I learn something totally new and chall
2. re: Aviator——让表达式飞起来
很好用,刚用到最近的一个项目中
--welcomezhang
3. re: Java字符串的最大长度
写得很好
--zzz
4. clashofclanshack1155
Very clean site, thanks for this post.
--Very clean site, thanks for this post.
5. binaryrobot89773
评论内容较长,点击标题查看
--Howdy! I simply wish to offer you a big thumbs up