具有缓存功能的ServiceLocator

原创 2004年08月30日 17:17:00

  1. package cn.edu.ouc.jwc.util.tools;

  2. import java.util.*;
  3. import javax.ejb.*;
  4. import javax.mail.*;
  5. import javax.naming.*;
  6. import javax.rmi.*;
  7. import javax.sql.*;
  8. /**
  9. * DOCUMENT ME!
  10. *
  11. * @author $author$
  12. * @version $Revision$
  13. */
  14. public class ServiceLocator {
  15. private static ServiceLocator serviceLocator;
  16. private static Context context; //cache of the context
  17. private Map ejbHomeCache; //cache of the ejbhome
  18. private Map dateSourceCache; ////cache of the datasource
  19. protected ServiceLocator()
  20. throws ServiceLocatorException {
  21. ejbHomeCache = new HashMap();
  22. dateSourceCache = new HashMap();
  23. try {
  24. context = getInitialContext();
  25. }
  26. catch (Exception e) {
  27. throw new ServiceLocatorException(e.getMessage());
  28. }
  29. }
  30. /**
  31. * 您应注意,映射中的关键并不是传递到 lookup() 方法的 JNDI 名称。将同一 home 接口绑定到不同
  32. * JNDI名称是很常见的,但这样做会在您的映射中产生副本。通过依靠类本身,您就可以确保最终不会为同 一个bean 创建多个 home接口。有必要指出,对home接口的缓存
  33. * 不会干扰您容器的bean 管理。容器管 理的是 bean 实例,而不是这些 bean 实例的 home接口。您的容器还将管理实例交换, 以及其它您希望它执行的任何优化。
  34. *
  35. * @param ejbName String
  36. * @param ejbClass Class
  37. *
  38. * @return EJBHome
  39. *
  40. * @throws ServiceLocatorException DOCUMENT ME!
  41. */
  42. public EJBHome getEjbHome(String ejbName, Class ejbClass)
  43. throws ServiceLocatorException {
  44. EJBHome ejbHome = null;
  45. ejbHome = ( EJBHome ) ejbHomeCache.get(ejbClass);
  46. if (ejbHome != null)
  47. return ejbHome;
  48. try {
  49. Object object = context.lookup(ejbName);
  50. ejbHome = ( EJBHome ) PortableRemoteObject.narrow(object, ejbClass);
  51. if (ejbHome == null)
  52. throw new ServiceLocatorException("Could not get home for " + ejbName);
  53. ejbHomeCache.put(ejbClass, ejbHome);
  54. return ejbHome;
  55. }
  56. catch (NamingException ne) {
  57. throw new ServiceLocatorException(ne.getMessage());
  58. }
  59. }
  60. /**
  61. * 为了方便调用,使用与getEjbHome()不同的cache方法
  62. *
  63. * @param ejbName String
  64. *
  65. * @return EJBLocalHome
  66. *
  67. * @throws ServiceLocatorException
  68. */
  69. public EJBLocalHome getEjbLocalHome(String ejbName)
  70. throws ServiceLocatorException {
  71. EJBLocalHome ejbLocalHome = null;
  72. ejbLocalHome = ( EJBLocalHome ) ejbHomeCache.get(ejbName);
  73. if (ejbLocalHome != null)
  74. return ejbLocalHome;
  75. try {
  76. Object object = context.lookup(ejbName);
  77. ejbLocalHome = ( EJBLocalHome ) object;
  78. if (ejbLocalHome == null)
  79. throw new ServiceLocatorException("Could not get local home for " + ejbName);
  80. ejbHomeCache.put(ejbName, ejbLocalHome);
  81. return ejbLocalHome;
  82. }
  83. catch (NamingException ne) {
  84. throw new ServiceLocatorException(ne.getMessage());
  85. }
  86. }
  87. /**
  88. * 缓存了session实例
  89. *
  90. * @param sessionName String
  91. *
  92. * @return Session
  93. *
  94. * @throws ServiceLocatorException
  95. */
  96. public Session getMailSession(String sessionName)
  97. throws ServiceLocatorException {
  98. Session session = null;
  99. session = ( Session ) ejbHomeCache.get(sessionName);
  100. try {
  101. session = ( Session ) context.lookup(sessionName);
  102. if (session == null)
  103. throw new ServiceLocatorException("Could not get mail session for " + sessionName);
  104. ejbHomeCache.put(sessionName, session);
  105. return session;
  106. }
  107. catch (NamingException ne) {
  108. throw new ServiceLocatorException(ne.getMessage());
  109. }
  110. }
  111. /**
  112. * DOCUMENT ME!
  113. *
  114. * @return DOCUMENT ME!
  115. *
  116. * @throws ServiceLocatorException DOCUMENT ME!
  117. */
  118. public static synchronized ServiceLocator getInstance()
  119. throws ServiceLocatorException {
  120. if (serviceLocator == null)
  121. serviceLocator = new ServiceLocator();
  122. return serviceLocator;
  123. }
  124. /**
  125. * 两个线程同时进行 getInitialContext()是绝对有可能的(从而一次创建两个上下文), 但只有首次调用该方法时才会发生此类错误。因为问题至多只会发生一次,所以同步是不必
  126. * 要的,实际上,同步引入的复杂性比它所解决的复杂性更多。
  127. *
  128. * @return Context
  129. *
  130. * @throws Exception
  131. */
  132. private Context getInitialContext()
  133. throws Exception {
  134. String url = "t3://ECLIPSE:80";
  135. String user = null;
  136. String password = null;
  137. Properties properties = null;
  138. try {
  139. properties = new Properties();
  140. properties.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
  141. properties.put(Context.PROVIDER_URL, url);
  142. if (user != null) {
  143. properties.put(Context.SECURITY_PRINCIPAL, user);
  144. properties.put(Context.SECURITY_CREDENTIALS, password == null ? "" : password);
  145. }
  146. return new InitialContext(properties);
  147. }
  148. catch (Exception e) {
  149. System.out.println("Unable to connect to WebLogic server at " + url);
  150. System.out.println("Please make sure that the server is running.");
  151. throw e;
  152. }
  153. }
  154. /**
  155. * getDataSource
  156. *
  157. * @param dataSourceName String
  158. *
  159. * @return DataSource
  160. *
  161. * @throws ServiceLocatorException DOCUMENT ME!
  162. */
  163. public DataSource getDataSource(String dataSourceName)
  164. throws ServiceLocatorException {
  165. DataSource dataSource = null;
  166. dataSource = ( DataSource ) dateSourceCache.get(dataSourceName);
  167. if (dataSource != null)
  168. return dataSource;
  169. try {
  170. dataSource = ( DataSource ) context.lookup(dataSourceName);
  171. if (dataSource == null)
  172. throw new ServiceLocatorException("Could not get datasource for " + dataSourceName);
  173. dateSourceCache.put(dataSourceName, dataSource);
  174. return dataSource;
  175. }
  176. catch (NamingException ne) {
  177. throw new ServiceLocatorException(ne);
  178. }
  179. catch (Exception e) {
  180. throw new ServiceLocatorException(e);
  181. }
  182. }
  183. }

按位与、按位异或、按位取反

& 按位与  | 按位或  ^ 按位异或  1. 按位与运算 按位与运算符"&"是双目运算符。其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1 ,否则为0。参...
  • u010236550
  • u010236550
  • 2014年01月19日 08:52
  • 1497

《招聘一个靠谱的iOS》面试题参考答案(上)

说明:面试题来源是微博@我就叫Sunny怎么了的这篇博文:《招聘一个靠谱的 iOS》,其中共55题,除第一题为纠错题外,其他54道均为简答题。 出题者简介: 孙源(sunnyxx),目前就职于百...
  • PRliu
  • PRliu
  • 2016年04月28日 17:45
  • 1119

笔记本USB的PowerShare功能

宿舍又要开进入晚上11点(11点半)熄灯的节奏了,晚上不能给电子产品充电了orz。幸好我有超薄移动电源,但是如果移动电源也跪了怎么办?不怕~~~ 我今天惊奇地发现,我的ThinkPad有一个USB具有...
  • u013390476
  • u013390476
  • 2015年03月13日 17:43
  • 2523

三分钟教你读懂汇票是什么

三分钟教你读懂汇票是什么 汇票 1、汇票的概念及特点 汇票(Draft)是出票人签发的,委托付款人在见票时或者在指定日期无条件支付确定金额给收款人或者持票人的票据。 ...
  • shuytu
  • shuytu
  • 2017年11月09日 19:45
  • 185

操作系统笔试题

1.基本知识点: 1) 操作系统是控制和管理计算机软硬件资源,以尽量合理有效的方法组织多个用户共享多种资源的程序集合。 2) 操作系统的基本功能:(1)处理机管理。主要功能包括进程控制、进程调度、进程...
  • monsion
  • monsion
  • 2013年09月22日 21:08
  • 1396

服务定位器模式(Service Locator Pattern)详解和代码示范

模式所要解决的问题Service Locator模式想要解决的问题是解耦合服务提供者和用户,用户无需直接访问具体的服务提供者类。比如发送短信/邮件,在应用程序的很多地方都会被使用,有两种简单的方法来实...
  • iefreer
  • iefreer
  • 2013年07月16日 14:39
  • 9275

IOS知识点mark

之前看了一片博客《招一个靠谱的IOS》文章。里面好多面试题,但苦于没有答案,之前都是在baidu中慢慢寻找答案。所幸只好感叹互联网的强大,在微博里看到了 iOS程序犭袁给出的参考答案。现在在自己的不可...
  • u010184533
  • u010184533
  • 2015年09月21日 22:22
  • 258

惠普统一功能测试 (UFT) 11.5的简介

惠普统一功能测试 (UFT) 软件是一款自动化软件测试解决方案,可应对技术及流程中的持续变更挑战。 它是现代应用测试领域的一次跃进,能显著地改进软件质量,同时降低测试成本和复杂度,即使在变更最快的环境...
  • qq_30942073
  • qq_30942073
  • 2015年10月25日 00:36
  • 337

具有edit功能的combobox

function htcInit() { defaults.viewLink=document; defaults.viewInheritStyle=false; Body_Init(); ...
  • u014440119
  • u014440119
  • 2014年04月21日 10:17
  • 375

位图文件读写综述

位图文件读写综述  转自:http://www.vckbase.com/index.php/wv/475 一、位图文件结构 1.位图文件头 2.位图信息 2.1位图信息头 2.2 颜色表 ...
  • chenjie863
  • chenjie863
  • 2013年11月23日 15:37
  • 1501
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:具有缓存功能的ServiceLocator
举报原因:
原因补充:

(最多只允许输入30个字)