具有缓存功能的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. }

具有缓存功能的ServiceLocator

package cn.edu.ouc.jwc.util.tools; import java.util.*; import javax.ejb.*; import javax.mail.*;...
  • gojava
  • gojava
  • 2004-08-30 17:17:00
  • 1211

设计模式学习—服务定位模式(Service Locator Design Pattern)

设计模式之服务定位模式,一种JavaEE模式
  • bird3014
  • bird3014
  • 2017-09-08 17:52:58
  • 658

用SERVICE LOCATOR 模式实现访问命名服务

      在B/S开发中, 我们经常要用到名称服务,如JNDI,XMLNS等。名称服务随不同厂家而不同。每次需要获得名称服务时,需要适当的名称环境信息,然后查找服务,重复查找的成本很高。此外,在持久...
  • touchSea
  • touchSea
  • 2006-05-20 21:15:00
  • 1108

服务定位器模式(service locator)

Using a Service Locator使用服务定位器    The key benefit of a Dependency Injector is that it removes the de...
  • cz_hyf
  • cz_hyf
  • 2007-02-10 20:20:00
  • 10616

[Design Pattern] Service Locator Pattern

 How JNDI lookups are accomplished can vary from vendor to vendor. In addition, repeated JNDI lookup...
  • Fitzwilliam
  • Fitzwilliam
  • 2007-03-23 18:10:00
  • 2368

(服务定位器)Service Locator

1、引入Service Locator的目的在于解耦。Service Locator模式的优点: Service Locator充当了一个运行时的连接器的角色,可以在运行时,动态地修改一个类索要选用的...
  • u012519541
  • u012519541
  • 2017-01-09 18:34:07
  • 157

使用service locator快速定位你的服务

申明:本人对java了解不太深,发表的观点可能有不当之处,如有之请不吝赐教。service locator模式在老早的j2ee中就被提出来,原因是在一个程序中有大量服务(service)时,使用者调用...
  • googlezhang
  • googlezhang
  • 2011-04-05 13:27:00
  • 1418

Autofac的ServiceLocator模式应用,零配置

  • 2017年02月05日 23:29
  • 3.23MB
  • 下载

利用ServiceLocator模式改进JNDI实践

J2EE应用系统是打了“分布式”的标签的,所以客户端需要定位业务层的组件和服务,常见的比如有:EJB Home接口、EJB LocalHome接口、JMS消息列队或主题、JMS消息列队工厂等等,当然还...
  • gqltt
  • gqltt
  • 2012-05-15 15:42:07
  • 626

C#中提供服务方式ServiceLocator

软件端框架提供Service的一种形式
  • i0703mtf
  • i0703mtf
  • 2016-08-22 14:36:27
  • 1490
收藏助手
不良信息举报
您举报文章:具有缓存功能的ServiceLocator
举报原因:
原因补充:

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