一种对企业级Java组件的方法进行调用的方法

文档序号:6415005阅读:160来源:国知局
专利名称:一种对企业级Java组件的方法进行调用的方法
技术领域
本发明涉及Java技术,特别是涉及一种对企业级Java组件的方法进行调用的方法。
背景技术
在Java技术中,组件(Bean)是一个基于Java软件组件模型(JavaBeans)的可重复使用的Java模块。在Bean中,方法是一个代码模块,生成一个对象实例的行为,并且与程序性编程语言中的函数相似。为了定义一个方法,Bean的提供者必须对该方法进行声明,然后实现其主体。而客户端可以通过调用Bean的方法来获取和设置Bean的属性,并完成对Bean的各种操作。
企业级Java Bean(EJB,Enterprise Java Bean)是实现服务器端应用服务的组件。EJB架构是支撑EJB的容器系统,是一种针对面向对象分布式商业应用的开发和部署的组件式架构。使用EJB架构开发的应用,具有良好的伸缩性、可靠的事务处理和多用户安全性,而且,这些应用只需开发一次,即可部署到任何支持EJB规范的服务器平台。
EJB架构能够灵活实现下述部件一种代表无状态服务的对象;一种代表无状态服务的对象,实现环球网(WEB)服务终端(endpoint);一种代表无状态服务的对象,提供消息驱动的异步调用;一种代表客户端会话的对象,自动维护多个客户端调用方法的会话状态;一种实体对象,代表可被多个客户端共享的商业对象;一种实体对象,代表一种细线条(fine-grained)的持久性存储对象,其中包含了相应粗线条(coarse-grained)商业对象的持久性存储状态。
针对上述特点,EJB架构定义了三种类型的EJB会话Bean(SessionBean)、实体Bean(Entity Bean)和消息驱动Bean(MDB,Message-drivenBean)。并且,EJB架构规定,会话Bean和实体Bean的方法为同步方法,即所有对会话Bean或实体Bean的调用都是同步的,而MDB的方法为异步方法,即所有对MDB的调用都是异步的。
由于客户端必须通过调用Bean的方法来完成对Bean对象的各种操作,但是同步调用是使用当前正在执行的线程,客户端的调用很可能被阻塞,而异步调用则是独占一个线程,客户端的调用不会被阻塞,客户端经常需要通过调用Bean的异步方法来完成对Bean的各种操作。因此,为了达到对会话Bean或实体Bean方法的异步调用,现有技术采用了一个迂回的手段,即通过MDB来实现对会话Bean或实体Bean方法的异步调用。
在现有技术中,Bean的提供者为会话Bean或实体Bean提供一个特定的MDB,并指定该MDB在Java消息服务器(JMS)中的标识Topic,以及指定该MDB可处理的JMS消息的协议类型。同时,Bean的提供者指定标识Topic、MDB与Bean三者之间一一对应的关系。
图1是现有技术对会话Bean或实体Bean的方法进行异步调用的示意图,图2是现有技术对会话Bean或实体Bean的方法进行异步调用的流程图。参见图1和图2,在现有技术中,实现对会话Bean或实体Bean的方法进行异步调用的具体过程包括以下步骤步骤201客户端在JMS服务器的上下文(Context)中,查找到(lookup)与目标Bean即客户端调用的会话Bean或实体Bean相对应的标识Topic。
步骤202客户端将请求调用目标Bean异步方法的JMS消息发送至JMS服务器。
这里,客户端发送的JMS消息的协议类型为Bean的提供者部署该目标Bean时所指定的JMS消息的协议类型。并且,客户端发送的JMS消息中携带有目标Bean方法的名称。
步骤203JMS服务器判断当前是否有其它调用在执行,如果是,则执行步骤204,否则直接执行步骤205。
步骤204JMS服务器将客户端的调用保存在调用队列中,当调用线程的下一次轮询到达时,返回步骤203。
步骤205JMS服务器将接收到的JMS消息发送到与查找到的标识Topic对应的MDB上。
步骤206MDB解析JMS消息,在EJB服务器的上下文中查找到目标Bean,然后通过该目标Bean的Home接口得到Bean的一个实例。
这里,因为客户端所要调用的目标Bean与MDB之间存在对应关系,所以MDB在EJB服务器的上下文中查找到与其对应的Bean后,即查找到了目标Bean。
步骤207MDB向EJB框架(EJB Stub)发送调用消息,并在该调用消息中携带目标Bean的接口参数。
步骤208EJB框架为目标Bean创建一个调用对象,将所创建的调用对象存入当前调用队列中。
步骤209EJB框架判断当前是否有调用线程在目标Bean上执行,如果是,则执行步骤210,否则直接执行步骤211。
步骤210在当前调用队列中等待,当调用线程的下一次轮询到达时返回步骤209。
步骤211当前调用线程获得执行锁,EJB框架将当前调用线程传递给EJB容器。
步骤212EJB容器调用客户端所需的目标Bean的方法。
图3是现有技术对会话Bean或实体Bean的方法进行同步调用的流程图。参见图3,在现有技术中,实现对目标会话Bean或实体Bean的方法进行同步调用的具体过程包括以下步骤步骤301客户端通过Bean在客户端上下文中的Home Stub查找到(lookup)目标Bean即客户端所要调用的会话Bean或实体Bean的Home接口。
步骤302客户端通过调用所查找到的Home接口的create()方法创建一个Bean实例,并通过目标Bean在客户端的Remote Stub调用目标Bean的方法。
步骤303EJB框架创建一个同步调用对象,并将该同步调用对象存入SFSB对象实例框架的调用队列的当前同步线程中。
步骤304EJB框架判断当前是否有调用线程在目标Bean上执行,如果是,则执行步骤305,否则直接执行步骤306。
步骤305EJB框架将客户端的调用保存在步骤303中所述的调用队列中,当调用线程的下一次轮询到达时,返回步骤304。
步骤306当前同步调用线程获得执行锁,EJB框架取出同步调用对象交给EJB容器。
步骤307EJB容器调用客户端所需的目标Bean中的方法。
由此可见,现有技术实现对会话Bean或实体Bean的方法进行调用的过程存在以下缺点1、对EJB的同步方法和异步方法进行调用采取了不同的途径,客户端无法通过统一的手段声明其调用,从而大大增加了客户端实现调用EJB方法的难度。
2、对会话Bean或实体Bean方法的异步调用必须经过6层结构,即JMS客户端、JMS服务器、MDB、EJB框架、EJB容器和目标Bean,使得调用过程繁杂,大大降低了系统性能。
3、客户端对会话Bean或实体Bean的方法执行异步调用,是通过发送JMS消息到MDB上来完成的,所以Bean的提供者必须理解JMS的架构,这样才可以使其提供的MDB能够解析出JMS消息,从而为Bean提供者增加了工作难度,降低了Bean提供者的生产效率,并降低了应用的可维护性。
4、Bean的提供者需要规定MDB可解析的JMS消息所遵从的协议类型,而该协议类型并没有统一标准,所以容易造成Bean提供者规定的JMS消息的协议类型与客户端发送的JMS消息的协议类型存在不同,从而导致调用无法执行。
5、客户端发送的JMS消息的协议类型必须为Bean的提供者部署Bean时所指定的消息协议类型,客户端必须能够制造不同协议类型的JMS消息,因此对客户端提出了较高的要求,增加了客户端调用的难度。
6、为了实现对会话Bean或实体Bean方法的异步调用,需要购买JMS服务器并对其进行管理和维护,从而大大增加了Bean的业务开发商的成本和工作量。

发明内容
有鉴于此,本发明的主要目的在于提供一种对企业级Java组件的方法进行调用的方法,从而大大简化客户端调用EJB方法的过程。
为了达到上述目的,本发明的技术方案是这样实现的一种对企业级Java组件的方法进行调用的方法,在指定的企业级Java组件EJB的描述文件中声明异步方法,该对企业级Java组件的方法进行调用的方法还包括以下步骤A、客户端通过EJB的应用程序接口将调用目标EJB方法的请求发送至EJB框架;B、EJB框架判断目标EJB的描述文件中是否已将客户端调用的目标EJB的方法声明为异步方法,如果是,则执行步骤C,否则,执行调用同步方法,然后结束本流程;C、EJB框架创建一个异步调用对象,为目标EJB的异步方法启动一个未被使用的异步调用线程,然后将该异步调用线程传递给目标EJB的容器;D、该EJB容器调用目标EJB中的异步方法。
当所述目标EJB为有状态会话Bean时,步骤B中所述的执行调用同步方法包括以下步骤
B1、EJB框架创建一个同步调用对象,并将该同步调用对象存入对象实例框架的调用队列中,然后判断当前是否有其它调用线程在目标EJB上执行,如果有,则执行步骤B2,否则,直接执行步骤B3;B2、EJB框架将客户端的调用阻塞在一个线程中,直到在客户端调用的EJB上执行的其它调用线程均执行完毕后,执行步骤B3;B3、EJB框架使客户端的调用线程获得执行锁,然后将该调用线程传递给目标EJB的容器;B4、该EJB容器调用目标EJB中客户端所需的同步方法,然后结束当前调用同步方法的流程。
当所述目标EJB为无状态会话Bean或实体Bean时,步骤B中所述的执行调用同步方法包括以下步骤B1、EJB框架创建一个同步调用对象,并将该同步调用对象存入对象实例框架的调用队列中;B2、EJB框架将客户端的调用置于当前在目标EJB上执行的线程中;B3、目标EJB容器调用目标EJB中客户端所需的同步方法,然后结束当前调用同步方法的流程。
步骤C中,在EJB框架创建一个异步调用对象与为目标EJB的异步方法启动一个未被使用的异步调用线程之间,进一步包括以下步骤C1、EJB框架判断当前是否有其它调用线程在目标EJB上执行,如果是,则执行步骤C2,否则,继续执行所述的为目标EJB的异步方法启动一个未被使用的异步调用线程的步骤;C2、EJB框架保存客户端的调用,当调用线程的下一次轮询到达时,返回步骤C1。
可见,本发明提出的方法具有以下优点1、对EJB的同步方法和异步方法进行调用通过相同的途径,客户端可通过统一的手段声明其调用,从而大大简化客户端调用EJB方法的过程。
2、对EJB的异步方法调用只需经过3层结构,即EJB框架、EJB容器和目标Bean,从而大大简化了对EJB方法异步调用的过程,提高了系统性能。
3、在本发明中,Bean的提供者无需理解JMS的架构,只需在其提供的EJB容器中封装更多的底层细节,从而大大降低了Bean提供者的工作难度,提供了应用的可维护性。
4、在客户端和EJB容器之间是标准的JAVA接口,即应用程序接口(API),客户端在调用Bean时,无需构造JMS消息,从而保证了客户端和服务器之间消息的正确性,降低了系统的出错概率。
5、客户端在Bean上执行异步方法调用时,不必为异步方法调用构造特定协议类型的JMS消息,不需要懂得JMS应用,从而大大简化了客户端的调用。
6、客户端的异步调用直接工作在Bean的接口上,使得客户端对Bean同步和异步方法的调用过程完全相同,所以Bean的提供者可以采取统一的手段声明Bean的同步和异步方法,从而为Bean的提供者带来极大的便利。


图1是现有技术对会话Bean或实体Bean的方法进行异步调用的示意图。
图2是现有技术对会话Bean或实体Bean的方法进行异步调用的流程图。
图3是现有技术对会话Bean或实体Bean的方法进行同步调用的流程图。
图4是本发明对会话Bean或实体Bean的方法进行异步调用的流程图。
图5是在本发明中无其它调用执行时SFSB容器执行调用同步方法的流程图。
图6是在本发明中有其它调用执行时SFSB容器执行调用同步方法的流程图。
具体实施例方式
为使本发明的目的、技术方案和优点更加清楚,下面结合附图及实施例对本发明作进一步地详细描述。
在本发明中,Bean的提供者为指定的以异步方式调用的会话Bean或实体Bean定制一个描述文件,并在该描述文件中声明Bean中被异步调用的方法的名称。这里,所述指定的以异步方式调用的会话Bean或实体Bean是由Bean的提供者根据运营商的需求而指定的。在EJB容器上部署该Bean,EJB容器则分别生成EJB服务器桩(Stub)和用户端的Stub,服务器端和用户端的Stub之间封装了调用Bean时消息交互的细节。然后将客户端的Stub输入到客户端上下文中。
图4是本发明对会话Bean或实体Bean的方法进行异步调用的流程图。参见图4,在本发明中,实现对会话Bean或实体Bean的方法进行异步调用的具体过程包括以下步骤步骤401客户端通过Bean在客户端上下文中的Home Stub查找到(lookup)目标Bean即客户端所要调用的会话Bean或实体Bean的Home接口。
这里,客户端查找到的Home接口是标准的JAVA接口,即API。并且,客户端根据Bean的提供者所提供的接口定义,获知所调用的方法为异步方法。
步骤402客户端通过调用所查找到的Home接口的create()方法创建一个Bean实例,并通过目标Bean在客户端的Remote Stub调用Bean的方法。
步骤403EJB框架判断客户端调用的目标Bean的方法是否在目标Bean的描述文件中被指定为异步方法,如果是,则执行步骤404,否则,进行同步方法的调用过程,并跳出本流程。
步骤404EJB框架创建一个异步调用对象,将其存入目标Bean的调用队列中。
步骤405EJB框架判断当前是否有调用线程在目标Bean上执行,如果是,则执行步骤406,否则直接执行步骤407。
步骤406EJB框架将客户端的调用保存在步骤404中所述的调用队列中,当调用线程的下一次轮询到达时,返回步骤405。
步骤407EJB框架为客户端的异步调用方法启动一个新的异步调用线程,取出上述异步调用对象交给EJB容器执行,该异步调用线程获得执行锁。
步骤408EJB容器调用客户端所需的目标Bean的异步方法。
因为会话Bean分为有状态会话Bean(SFSB)和无状态会话Bean(SLSB),而SFSB要求保存顺序状态,多个调用必须依次执行,而SLSB不需要保存状态,多个调用可以同时执行。因此,在对会话Bean或实体Bean的方法进行调用时,本发明提供了一个较佳调度机制将调用层划分为两种类型,一种是针对有状态会话Bean的顺序调用层,另一种是针对无状态会话Bean以及实体Bean的并发调用层。
当客户端调用有状态会话Bean的方法时,EJB容器直接使用顺序调用层对该EJB方法进行调用,其调用分为四种情况当前无其它调用在目标Bean上执行时,SFSB容器执行异步方法调用;当前有其它调用在目标Bean上执行时,SFSB容器执行异步方法调用;当前无其它调用在目标Bean上执行时,SFSB容器执行同步方法调用;当前有其它调用在目标Bean上执行时,SFSB容器执行同步方法调用。
无论当前是否有其它调用在客户端所需的有状态会话Bean上执行,EJB容器使用顺序调用层对有状态会话Bean执行异步方法调用的具体过程与上述本发明实现对EJB方法进行异步调用的具体过程相同。
图5是在本发明中无其它调用执行时SFSB容器执行调用同步方法的流程图。参见图5,在本发明中,如果当前无其它调用在客户端所需的有状态会话Bean上执行时,SFSB容器实现对有状态会话Bean同步方法进行调用的具体过程包括以下步骤步骤501~步骤502与步骤401~到步骤402相同。
步骤503EJB框架创建一个同步调用对象,并将该同步调用对象存入SFSB对象实例框架的调用队列的当前同步线程中。
步骤504当前同步调用线程获得执行锁,EJB框架取出同步调用对象交给EJB容器执行。
步骤505EJB容器调用客户端所需的目标Bean中的同步方法。
图6是在本发明中有其它调用执行时SFSB容器执行调用同步方法的流程图。参见图6,在本发明中,如果当前有其它调用在客户端所需的有状态会话Bean上执行时,SFSB容器实现对有状态会话Bean的同步方法进行调用的具体过程包括以下步骤步骤601~步骤603与步骤501~步骤503相同。
步骤604由于当前有其它调用线程在Bean上执行,所以该调用线程被阻塞,等待通知。
步骤605调用线程收到通知,告知前面的调用线程已完成执行。
步骤606该调用线程获得执行锁,EJB框架将同步调用线程传递给EJB容器。
步骤607EJB容器调用目标Bean中客户端所需的同步方法。
当客户端调用无状态会话Bean或实体Bean的方法时,EJB容器直接使用并发调用层对该目标EJB方法进行调用,其实现机制为如果客户端调用无状态会话Bean或实体Bean的一个异步方法,无论当前是否有其它调用在该Bean上执行,并发调用层将客户端的调用分发给系统中可用的线程池,执行调用。该调用过程具体为,执行上述对EJB方法进行异步调用的具体过程中除步骤405和步骤406之外的所有步骤。
如果客户端调用无状态会话Bean或实体Bean的一个同步方法,无论当前是否有其它调用在该Bean上执行,EJB容器使用并发调用层直接在当前执行调用的线程中执行客户端的调用。
总之,以上所述仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
权利要求
1.一种对企业级Java组件的方法进行调用的方法,其特征在于,在指定的企业级Java组件EJB的描述文件中声明异步方法,该对企业级Java组件的方法进行调用的方法还包括以下步骤A、客户端通过应用程序接口将调用目标EJB方法的请求发送至EJB框架;B、EJB框架判断目标EJB的描述文件中是否已将客户端调用的目标EJB的方法声明为异步方法,如果是,则执行步骤C,否则,调用同步方法,然后结束本流程;C、EJB框架创建一个异步调用对象,为目标EJB的异步方法启动一个未被使用的异步调用线程,然后将该异步调用线程传递给目标EJB的容器;D、该EJB容器调用目标EJB中的异步方法。
2.根据权利要求1所述的方法,其特征在于,当所述目标EJB为有状态会话Bean时,步骤B中所述的执行调用同步方法包括以下步骤B1、EJB框架创建一个同步调用对象,并将该同步调用对象存入对象实例框架的调用队列中,然后判断当前是否有其它调用线程在目标EJB上执行,如果有,则执行步骤B2,否则,直接执行步骤B3;B2、EJB框架将客户端的调用阻塞在一个线程中,直到在客户端调用的EJB上执行的其它调用线程均执行完毕后,执行步骤B3;B3、EJB框架使客户端的调用线程获得执行锁,然后将该调用线程传递给目标EJB的容器;B4、该EJB容器调用目标EJB中客户端所需的同步方法,然后结束当前调用同步方法的流程。
3.根据权利要求1所述的方法,其特征在于,当所述目标EJB为无状态会话Bean或实体Bean时,步骤B中所述的执行调用同步方法包括以下步骤B1、EJB框架创建一个同步调用对象,并将该同步调用对象存入对象实例框架的调用队列中;B2、EJB框架将客户端的调用置于当前在目标EJB上执行的线程中;B3、目标EJB容器调用目标EJB中客户端所需的同步方法,然后结束当前调用同步方法的流程。
4.根据权利要求1所述的方法,其特征在于,步骤C中,在EJB框架创建一个异步调用对象与为目标EJB的异步方法启动一个未被使用的异步调用线程之间,进一步包括以下步骤C1、EJB框架判断当前是否有其它调用线程在目标EJB上执行,如果是,则执行步骤C2,否则,继续执行所述的为目标EJB的异步方法启动一个未被使用的异步调用线程的步骤;C2、EJB框架保存客户端的调用,当调用线程的下一次轮询到达时,返回步骤C1。
全文摘要
本发明公开了一种对企业级Java组件的方法进行调用的方法,在指定的企业级Java组件(EJB)的描述文件中声明异步方法,然后执行以下步骤A.客户端通过应用程序接口将调用目标EJB方法的请求发送至EJB框架;B.EJB框架判断目标EJB的描述文件中是否已将客户端调用的目标EJB的方法声明为异步方法,如果是,则执行步骤C,否则,执行调用同步方法,然后结束本流程;C.EJB框架创建一个异步调用对象,为目标EJB的异步方法启动一个未被使用的异步调用线程,并使该异步调用线程获得执行锁,然后将该异步调用线程传递给目标EJB的容器;D.该EJB容器调用目标EJB中的异步方法。本发明方法能够大大简化客户端调用EJB方法的过程。
文档编号G06F9/46GK1737762SQ20041005825
公开日2006年2月22日 申请日期2004年8月20日 优先权日2004年8月20日
发明者卡辛克·M, K·尤岱·金史尔, 杰立·库澜 申请人:华为技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1