专利名称:检索对象的制作方法
技术领域:
本发明涉及一种在网络中检索对象的方法,具体来说,涉及一种桥接JNDICJava 命名和目录接口)查找和万维网服务定位以检索作为通过JNDI查找或万维网服务定位可得到的最佳副本的对象的副本的方法。
背景技术:
Java命名和目录接口是允许客户端经由名称来查找对象(数据项)的接口。Java命名和目录接口本质上提供一种用于将对象绑定到名称的机制以及一种允许想要检索对象的客户端输入查询的目录查找接口。将JNDI用于定位服务对象的服务定位器是已知的,例如参见 http:// iava. sun, com/blueprints/core i2eepatterns/ Patterns/ServiceLocator. html。这解决了不同客户端以不同方式使用JNDI的问题,例如 EJB (Enterprise JavaBeans)客户端通过使用企业bean的已登记JNDI名称来使用JNDI查找EJBHome对象,而JMS (Java消息传递服务)客户端需要通过使用为JMS组件登记的JNDI 名称来查找JMS组件。它提出能够抽象所有JNDI使用并且隐藏初始上下文创建、EJB归属对象查找和EJB对象重新创建的复杂度的“服务定位器对象”。多个客户端能够再使用服务定位器对象来降低代码复杂度,并且提供单控制点。但是,通过EJB 3. O (Enterprise JavaBeans 3. 0)和 IOC (控制反转),现有服务定位器模式的有用性降低,因为beans随注释被注入而不是从JNDI查找。此外,它仅涵盖 JNDI使用和初始上下文创建的抽象。
发明内容
本发明的第一方面提供一种检索对象的方法。该方法包括检索通过JNDI对象定位和万维网服务定位可得到的最佳对象。术语“可得到的最佳对象”表示能够最快检索的对象的副本。因此,本发明桥接JNDI对象定位和万维网服务定位,并且与单独使用JNDI相比, 提供成功检索对象的增加的概率,同时允许比单独使用万维网服务定位更有效率的对象检索。例如,下面描述使用EJB 3的万维网服务定位,请参见:http://www. thereRister. co. uk/2007/01/23/eib web services/本发明可包括响应检索对象的请求,最初执行对于对象的JNDI搜索。如果JNDI 搜索定位了对象的副本,则检索该对象,但是如果JNDI搜索未定位对象的副本,则万维网服务定位用于设法定位远程万维网服务对象。一般来说,万维网服务定位在检索对象时比 JNDI搜索明显要慢。因此,尝试采用JNDI搜索来定位对象,并且仅当JNDI无法定位对象的副本时才使用万维网服务定位,这会减少定位对象的副本所花的时间。执行JNDI搜索可包括最初尝试定位对象的本地副本。如果定位了对象的本地副本,则检索这个对象,但是如果没有定位本地副本,则该方法尝试定位对象的远程副本。通过本地JNDI调用来调用请求比通过远程调用调用请求快,大约是其5-6倍,使得最初尝试定位对象的本地副本会减少定位对象的副本所花的时间。该方法可包括在尝试检索对象之前,尝试在高速缓存器中定位所请求对象。该方法可包括高速缓存已检索对象。高速缓存已检索对象意味着搜索成本仅在接收到对于对象的第一请求时才发生,因为通过返回对象的高速缓存副本(假定它仍然是最新的)能够满足对于那个对象的后续请求。本发明的其它方面提供对应的设备和对应的存储介质。
现在通过说明性示例、参照附图来描述本发明的优选实施例,附图中图1是示出本发明的方法的主要步骤的流程框图;图2是本发明的设备的示意框图;以及图3是类图。
具体实施例方式本发明基于在 http:// iava. sun, com/blueprints/core i2eepatterns/Patterns/ ServiceLocator. html所沭的服各定位器樽式,通过引用将其结合到本文中。但是,本发明扩展已知服务定位器,使得它能够抽象所有WS (万维网服务)和JNDI使用,并且因此提供比仅使用JNDI可能实现的更全面的对象定位。本发明的服务定位器仍然能够隐藏初始对象创建、万维网服务绑定、来自用户的EJB归属和远程查找的复杂度,并且因此是用户友好的。多个客户端能够再使用服务定位器来降低代码复杂度,提供单控制点,并且通过提供最佳可用协议调用优化来提高性能。服务定位器使用工厂设计模式来提供单控制点供查找不同对象。大家已知,“工厂设计模式”是面向对象的设计模式,它能够创建对象而不指定将要创建的对象的准确类。 关于工厂设计模式的更多信息在例如http://en. wikipedia. orR/wiki/factory Method Pattern可得到。在一个有利实现中,服务定位器使用简单算法,它将通过执行下列三个步骤来尝试返回可得到的最佳可能对象1.设法定位本地对象;2.如果1失败,则设法定位远程对象;3.如果2失败,则设法定位远程万维网服务对象在一个特别有利的实施例中,高速缓存响应用户请求而定位的对象。在这个实施例中,该算法还可包括在执行设法定位本地对象的步骤1之前,确定所请求对象是否已经可得到(因为它在早先搜索之后已经被高速缓存),以及如果高速缓存的副本是可得到的, 则确定高速缓存的副本是否仍然是最新的。如果所请求对象的最新高速缓存副本是可得到的,则返回高速缓存的副本,并且无需执行步骤1、2或3。下面进一步描述这种情况。在另一个有利实现中,服务定位器的协议调用优化是可配置的,以及如果没有选择优化,则万维网服务是缺省的_即,如果没有选择优化,则服务定位器不尝试上述步骤1 和2,而是直接转到步骤3。
图1是示出本发明的一个实施例的示意流程框图。一开始,在步骤1,服务定位器工厂(SLF)从客户端1接收对于对象的请求。在请求中通过万维网服务地址、如URL来标识该对象。图1中,请求被示为标识万维网服务的类型以及标识万维网服务本身,但是本发明并不局限于请求的任何特定格式。图1中,请求还被示为通过请求中的字段“布尔优化”来指示应当使用本发明的优化协议。如果标志指示没有选择优化,则服务定位器不尝试上述步骤1和2,而是直接转到尝试定位远程万维网服务对象的步骤3-这允许例如系统管理员在需要时禁止使用本发明的优化协议。在一个有利的实施例中,SLF 2保存它检索的对象的高速缓存副本,以便优化来自其它客户端的调用。如果SLF没有维护高速缓存器,则在接收到对于对象的请求时,它检查(步骤幻所请求对象是否存在于高速缓存器中以及所请求对象的任何参数是否已经变化(例如url)。如果所请求对象存在于高速缓存器中并且参数是相同的,则这指示对象的高速缓存副本仍然是最新的,以及在步骤15可将对象的高速缓存副本返回给客户端1。但是,如果所请求对象存在于高速缓存器中,但参数自高速缓存该对象以来已经变化,则这指示对象的高速缓存副本不再是最新的,并且因此不适合返回给客户端1。如果SLF先前从未检索和请求对象,则步骤2的结果当然是所请求对象在高速缓存器中不存在。如果SLF没有维护高速缓存器,则省略步骤2。如果步骤2未定位对象的最新副本或者没有被执行,则SLF 2在步骤3继续创建服务定位器SL 3,并且在步骤4向SL发送对于由客户端所请求的服务的请求。 SL 3 的仓1J 建——般如 http:// java. sun, com/blueprints/core.j2eepatterns/Patterns/ ServiceLocator. html 中所述。然后,该方法在步骤5检查SL是否配置成使用协议调用优化。如果SL配置成使用这种优化(如果“优化为真”),则该方法尝试最初使用JNDI查找来定位所请求对象,然后在JNDI查找未定位对象时搜索远程万维网服务对象。在图1的实施例中,如果步骤5确定SL配置成使用协议调用优化,则该方法应用上述三步骤算法。也就是说,该方法通过最初使用JNDI执行对于本地对象的查找,经由SL 来尝试查找本地参考对象。要进行这个操作,在步骤6创建初始上下文4,或者备选地,取决于语言和框架,可创建至初始上下文的链接(例如对于EJB 3.0,注入链接)。作为另一个备选方案,可通过采用EJB容器执行新hitialContext例程来检索初始上下文。随后, 在步骤7创建本地对象参考,并且在步骤8执行对于本地对象的JNDI查找。如果检索到对象,则在步骤14将它返回给SLF 2。在一种修改中,有可能选择在本地对象查找中不使用JNDI,而是绑定到Java虚拟机内可得到的本地对象,由此绕过JNDI。如果在步骤8对于本地对象的查找不成功,则SL使用JNDI来执行对于远程对象的查找。要进行这个操作,在步骤9创建远程对象参考,并且在步骤10执行对于远程对象的JNDI查找。如果检索到对象,则在步骤14将它返回给SLF 2。如果在步骤10对于远程对象的JNDI查找不成功,则SL在步骤11确定执行对于远程万维网服务对象的查找。在步骤12创建到万维网服务客户端工厂(例如到javax. xml.ws.Service http//java. sun, com/javaee/5/docs/api/javax/xml/ws/Service. html)的链接,并且在步骤13得到端口。如果检索到对象,则在步骤14将它返回给SLF 2。在步骤15,将已检索对象返回给客户端1。如果SLF维护高速缓存器,则在步骤14返回给SLF的任何对象可被加至高速缓存使用服务定位器3的一个重要优点是相同J2EE(Java2,Enterprise Edition)容器中并存的应用之间的调用的隐式优化。使用服务定位器,如果本地对象或远程(RMI-远程方法调用)对象不可得到,则仅将请求解析为万维网服务搜索。在JBoss上的测量结果表明,调用仅具有一个自变量的简单万维网服务对象定位请求比本地调用慢,平均为本地调用的速度的1/70,比RMI调用慢,平均为RMI调用的速度的1/12。等待时间也得到改进, 因为与等效WS调用相比,在优化时使用的CPU也减少。另一个优点在于,服务定位器使优化协议对用户是透明的。用户只是请求对象和 (有希望)接收所请求对象,并且不知道用于检索对象的方法(即,JNDI查找或远程万维网服务对象查找)。图1的方法可在任何适当编程的网络节点中执行,并且一般在能够实现SLF的应用服务器(AS)中执行。不需要新硬件来实现本发明。图2是示出包含能够实现本发明的方法的节点6、例如应用服务器6的网络8的示意框图。要求对象的节点1向应用服务器6发送请求。节点1被示为在网络8外部,但是节点1备选地可在网络8之内。当应用服务器6接收来自节点1的请求,并且执行该请求会涉及外部服务调用时, 应用服务器6将尝试根据以上所述的本发明的方法来定位那个对象。在一个有利的实施例中,应用服务器6将尝试使用上述优化协议来定位对象,其中应用服务器6最初寻找本地对象。如果不能找到本地对象,则应用服务器6寻找远程对象,即位于网络8的另一个节点的对象(图2中由节点7示意表示)。如果不能找到远程对象,则应用服务器6尝试定位远程万维网服务对象(图2中通过应用服务器6向因特网9发起查询来示意表示)。在图2中,节点1是应用服务器6的客户端,而应用服务器6是节点7或因特网9 的客户端。在图2的实施例中,应用服务器6实现图1的SLF 2、SL 3、初始上下文4和万维网服务客户端工厂5。图3是说明本发明的类图。在图3中-AServiceInterface是由本地或远程或WS实现类所使用的基本接口。-AServiceBean是能够是远程或本地EJB的会话Bean实现。-AServiceWS是万维网服务实现。-AServiceServiceLocator包含执行这个服务(AService)的特定代码的必要代码。它主要是诸如服务名称和JNDI名称之类的常数值的持有者。-ServiceLocator是包含所有子接口共同的逻辑的抽象类。-ServiceLocatorFactory是抽象工厂(来自抽象工厂设计模式)。-WSType (图中未示出)是所有可能的ServiceLocator实现的enum列表(这简化查找并且在例如使用String时减少投射误差)。注意,有可能具有作为使用EJB 3. O注释的相同类的AServiceBean和AServiceWS。对于图3的类图,调用ServiceLocatorFactory—>getService (WSType 类型、布尔优化、String wsUrl) throws MtvConf igurationException (MtvConfiguration ^ Java Exception,并且可由 java. Lang. Exception由 Exception Iff^0 Exception ^ Java i吾 llf 中的 Throwable类的子类,并且常规地用于指示异常情况已经发生。)这将返回服务AService 的优化实现。另外,ServiceLocatorFactory可保存最近得到的服务的高速缓存副本,以便优化来自其它客户端的调用。在尝试检索AService对象时,沿用上述方法其中之一。本发明一般可用于在网络中定位对象,而并不局限于任何一种特定使用。它可在移动系统或者在固定系统中使用。
权利要求
1.一种在网络中定位对象的方法,所述方法包括定位作为通过JNDI对象定位和万维网服务定位可得到的最佳副本的所述对象的副本。
2.如权利要求1所述的方法,包括响应对于对象的请求执行对于所述对象的Java命名和目录接口(JNDI)搜索;如果所述JNDI搜索定位了所述对象的副本,则检索由所述JNDI搜索所定位的所述副本;或者如果所述JNDI搜索未定位所述对象的副本,则尝试定位远程万维网服务对象。
3.如权利要求2所述的方法,包括如果定位了远程万维网服务对象,则检索所定位的远程万维网服务对象的副本。
4.如权利要求2所述的方法,其中,执行所述JNDI搜索包括尝试定位所述对象的本地副本;如果定位了所述对象的本地副本,则检索所述对象的所述本地副本;或者如果未定位所述对象的本地副本,则尝试定位所述对象的远程副本。
5.如权利要求4所述的方法,包括如果所述搜索定位了所述对象的远程副本,则检索所述对象的所述远程副本。
6.如以上权利要求中的任一项所述的方法,包括在尝试通过JNDI对象定位或万维网服务定位来定位所述对象之前,尝试在高速缓存器中定位所请求对象。
7.如以上权利要求中的任一项所述的方法,包括高速缓存已检索对象。
8.一种用于在网络中定位对象的网络节点,所述节点适合定位作为通过JNDI对象定位和万维网服务定位可得到的最佳副本的所述对象的副本。
9.如权利要求8所述的网络节点,适合执行对于所述对象的Java命名和目录接口(JNDI)搜索;如果所述JNDI搜索定位了所述对象的副本,则检索由所述JNDI搜索所定位的所述副本;或者如果所述JNDI搜索未定位所述对象的副本,则尝试定位远程万维网服务对象。
10.如权利要求9所述的网络节点,适合通过下列步骤来执行所述JNDI搜索尝试定位所述对象的本地副本;如果定位了所述对象的本地副本,则检索所述对象的所述本地副本;或者如果未定位所述对象的本地副本,则尝试定位所述对象的远程副本。
11.一种包含指令的计算机可读介质,所述指令在处理器上被执行时,执行在网络中定位对象的方法,所述方法包括定位作为通过JNDI对象定位和万维网服务定位可得到的最佳副本的对象的副本。
12.如权利要求11所述的计算机可读介质,所述方法包括响应对于对象的请求执行对于所述对象的Java命名和目录接口(JNDI)搜索;如果所述JNDI搜索定位了所述对象的副本,则检索由所述JNDI搜索所定位的所述副本;或者如果所述JNDI搜索未定位所述对象的副本,则尝试定位远程万维网服务对象。
全文摘要
一种在网络中定位对象的方法包括定位作为通过JNDI对象定位和万维网服务定位可得到的最佳副本的对象5的副本。在一个有利实施例中,该方法最初包括尝试定位对象的本地副本(步骤8)。如果没有定位对象的本地副本,则方法10尝试(步骤10)定位对象的远程副本。如果没有定位对象的远程副本,则该方法尝试(步骤12)定位远程万维网服务对象。
文档编号G06F9/46GK102171656SQ200880131441
公开日2011年8月31日 申请日期2008年10月1日 优先权日2008年10月1日
发明者N·塞维特 申请人:爱立信电话股份有限公司