一种分布式调用消息的方法和装置的制作方法

文档序号:7691748
专利名称:一种分布式调用消息的方法和装置的制作方法
技术领域
本发明涉及通信技术领域,尤其涉及一种分布式调用消息的方法和装置。
技术背景软总线技术提供跨平台、;夸语言的组件通信能力,解决了系统的分布性、 可扩展性问题,是实现分布式消息处理平台的基础。目前业界比较有影响力的软总线规范有3种,分别是公共对象请求代理体系结构(CORBA, Common Object Request Broker Architecture),分布式组件对象模型(DCOM, Distributed Component Object Model)和Java2平台企业片反(J2EE, Java 2 Platform, Enterprise Edition)。其中,CORBA是由对象管理组织(OMG, Object Management Government)制定的一种标准的面向对象应用程序的体系规范。DCOM是由微 软公司提出的,支持在局域网、广域网甚至互联网上不同计算机的对象之间 的通信。J2EE是SUN公司提出的分布式对象总线标准。以下就以CORBA为 例简单介绍分布式平台下调用消息的方式。当一个客户要使用某个对象实现所提供的服务时,其一般过程如下1) 客户通过某种方式找到特定对象的对象引用;2) 如果该对象实现有相应的接口定义语言(IDL, Interface Definition Language)存根,则客户可以通过该IDL存根向对象实现发出请求,否则,在 接口库的协助下,客户可以使用动态调用接口来向对象实现发送请求;3) 当对象调用请求通过IDL存根或动态调用接口到达对象请求代理 (ORB, Object Request Broker)核心后,ORB核心负责请求的传送,将其传送纟会 相应的对象适配器;4) 对象适配器接到该请求后,判断所请求的对象实现是否有IDL骨架存 在,如果有,则对象适配器通过该IDL骨架调用执行对象实现的操作;否则, 对象适配器将通过动态骨架接口中的动态实现例程来调用对象实现中的操 作;5)对象实现的特定操作方法体(method)执行完成后,结果将按照对象 请求传递和执行路径逆向返回给客户对象,结果可以是输出参数、输入输出 参数,返回值以及异常信息等。一般来说,分布式调用分为两种方式异步调用和同步调用。对于异步 调用,调用后不能立即获得结果,并且不阻塞线程而是继续执行后续逻辑。 异步调用适合于不立即关心调用结果或者连续进行一批不相关调用,以提高 效率。对于同步调用,调用时后续逻辑被阻塞,直到调用完成获得结果或调 用超时。通常,开发者更适应于同步调用,它看起来和本地调用一样方便,但是 由于分布式远程调用不可能像本地调用那样立即获得结果,而是会阻塞线程 直到得到结果或超时,这势必影响调用性能。如果想要提高系统的处理性能就需要使用异步调用方式,在定义IDL时 需要定义两个单向的操作, 一个用于发起调用, 一个用于发送结果,分别由 调用双方实现,并被客户端和服务器端调用。在对现有技术的研究和实践过程中,发明人发现在现有技术中,对于异 步调用,用户在调用后无法马上得到返回值,在调用的时候只管调用,对于 调用结果需要在另外一个地方去接收和处理,这种开发方式在一定程度上打 乱了程序逻辑,增加了开发的难度和成本,又降低了程序可读性和可维护性。 对于应用开发来说,使用同步调用的开发效率远比异步方式高,但传统的分 布式系统的同步调用要求将线程阻塞,对于大并发量的通信系统,有限的线 程资源和高代价的锁操作会在很大程度上影响处理性能。综上,在现有技术 的分布式调用消息的方法中,无法兼顾系统处理性能和业务开发效率。发明内容本发明实施例要解决的技术问题是提供一种分布式调用消息的方法和装 置,能够兼顾系统处理性能和业务开发效率。为解决上述技术问题,本发明所提供的分布式调用消息的方法和装置是 通过以下技术方案实现的本发明实施例提供了 一种分布式调用消息的方法,该方法包括在方法体内部采用异步方式发送调用请求消息;保存所述调用请求消息的调用栈信息及运行当前状态并退出所述方法体;当接收到所述调用请求消息的应答消息时,恢复保存的所述调用栈信息; 根据恢复的调用栈信息,恢复到退出所述方法体前所处运行当前状态, 继续执行后续逻辑。本发明实施例提供了一种分布式处理装置,该装置包括消息调用单元 和信息处理单元,其中所述消息调用单元包括消息发送单元、信息存储单元、栈信息维护单 元、消息接收单元,其中消息发送单元,在方法体内部采用异步方式发送调用请求消息;消息接收单元,接收所述调用请求消息的应答消息;信息存储单元,保存调用栈信息和所述方法体运行当前状态;栈信息维护单元,当所述消息发送单元发送调用请求消息后将所述调用 请求消息的调用栈信息和运行当前状态保存到信息存储单元并退出所述方法 体;在消息接收单元接收到应答消息时,将保存在信息存储单元的调用栈信 息恢复;信息处理单元,根据栈信息维护单元恢复出的栈信息,恢复到退出所述 方法体前所处运行当前状态,继续执行后续逻辑。从以上技术方案可以看出,本发明实施例在方法体内部采用异步调用发 送调用请求消息,在等待应答期间,线程不被堵塞,可以处理别的业务,因 此可以保证系统的处理性能;同时,当接收到所述调用请求消息的应答消息 时,由于可以通过恢复保存的栈信息直接恢复到退出所述方法体前所处运行 当前状态,并继续执行后续逻辑,后续逻辑可以直接应用当前方法体的调用 结果,对于开发人员来说,异步调用被封装在方法体内部,看到的只是该方 法体的处理和后续逻辑的顺序执行,就像同步调用一样,因此,可以降低业 务开发的复杂度,提高业务开发效率。总之,本发明实施例所记载的技术方案可以同时兼顾系统的处理性能和业务开发效率。


图1为本发明实施例中分布式处理装置实施例结构示意图; 图2为本发明实施例中分布式调用消息的方法实施例流程图; 图3为本发明实施例中异步调用的流程图; 图4为本发明实施例中的状态图。
具体实施方式
参照图1,为本发明实施例中分布式处理装置实施例结构示意图,该分布 式处理装置包括消息调用单元11和信息处理单元12,其中消息调用单元31包括消息发送单元111、消息接收单元112、信息存储 单元113、栈信息维护单元114,其中消息发送单元lll,在方法体(method)内部采用异步方式发送调用请求 消息;消息接收单元112,接收所述调用请求消息的应答消息;信息存储单元113,保存调用栈信息和所述方法体运行当前状态;栈信息维护单元114,当所述消息发送单元111发送调用请求消息后将所 述调用请求消息的调用栈信息和运行当前状态保存到信息存储单元113并退 出所述方法体;在消息接收单元112接收到应答消息时,将保存在信息存储 单元113的调用栈信息恢复;信息处理单元12,根据栈信息维护单元114恢复出的栈信息,恢复到退 出所述方法体前所处运行当前状态,继续执行后续逻辑。信息处理单元保存的调用栈信息和调用请求消息——对应,可以设置调 用请求消息标识与调用栈信息的对应关系,并且消息接收单元所返回的应答 消息中携带有与调用请求消息一致的标识,以使栈信息维护单元能够较快地 查找到保存的调用栈信息并恢复。信息处理单元执行后续逻辑可以是后续正常逻辑、超时处理逻辑,也可能是异常处理逻辑,分别对应消息接收单元所接收到的应答消息所携带的业 务调用结果。可以理解的是,所述分布式处理装置并不表示具体的设备名称,仅用于 表示可以用于分布式处理的装置。这种分布式处理装置应用范围非常广泛, 可以位于计算机、网络中等有分布式处理单元的任何的分布式处理系统中。对于这种分布式处理装置,可以通过消息调用单元对其他的远程服务进 行调用,指定被调用对象和被调用方法体、设置调用参数等,通过消息驱动 状态进行迁移,并且在迁移前消息调用单元已经接收返回结果,信息处理单 元可以直接利用该返回结果,所以,从使用体验上来看,异步调用被封装在 方法体内部,开发人员看到的只是该方法体的处理和后续逻辑的顺序执行,和同步调用完全相同,因此这种分布式处理装置的消息调用方式对开发人员 来讲更友好,可以降低业务开发的复杂度,提高业务开发效率。而在消息调 用单元内部,使用异步方式进行消息调用,在等待消息应答期间,线程不会 被堵塞,可以继续处理别的业务,因此同时也可以保证系统的处理性能。综 上,这种分布式处理装置既能提高业务开发效率,又能兼顾系统处理性能。参照图2,为一个分布式调用消息的方法实施例流程图,以下通过方法体Fl中的具体调用过程进行说明步骤21、在方法体F1中采用异步调用方式发送foo调用请求消息并执行 步骤22;其中,方法体(method)为类的成员,是与类关联的函数,可以访问所 在类中的元素。对于上述异步调用方式,参照图3,为本发明实施例中异步调用的流程图, 在分布式系统中进行一来一回两次异步调用的具体过程如下步骤211、调用者向被调用者发起调用请求;调用者发起调用后,继续执行后续逻辑。步骤212、被调用者接收到请求后进行处理;步骤213、被调用者发起调用请求,其中携带有处理调用者请求所得到的结果。步骤214、调用者接收被调用者的调用请求,进行处理,得到处理结果。步骤22、保存foo调用请求消息的调用栈信息及运行当前状态并退出方 法体F1;在退出方法体F1前保存所述调用栈信息及运行当前状态,然后释放当前 线程,此后线程可以继续处理其他调用,以保证系统的处理性能。步骤23、当接收到foo调用请求消息的应答消息后,恢复保存的调用栈 4吕息;步骤24、根据恢复的调用栈信息,恢复到退出Fl方法体前所处运行当前 状态,继续执行后续逻辑。调度线程根据恢复的调用栈信息再次调度进入方法体F1后,从退出方法 体Fl前的运行当前状态继续执行后续逻辑,直到方法体Fl逻辑结束并退出 方法体F1。由于后续逻辑可以直接使用步骤43应答消息中所返回的调用结果,因此, 从开发人员来看,与同步调用方式相同,不需要打乱业务逻辑,因此可以降 低业务开发的复杂度,提高业务开发效率。其中,为了较快地查找到保存的调用栈信息,迅速恢复到退出方法体F1 前所处运行当前状态,可以设置调用栈信息与调用请求消息和调用应答消息 的对应关系,具体为预先设定调用请求消息的标识与该请求消息对应的应 答消息具有相同的标识(ID, Identification),在保存调用栈信息的同时,保存该 调用栈信息对应的调用请求消息的ID,当接收到所述调用请求消息的应答消 息时,查找与应答消息具有相同ID的调用栈信息,进而恢复该调用栈信息及 退出方法体前所处运行当前状态,执行后续逻辑。为便于理解,这种方法可以采用状态图对应用服务的逻辑进行描述,可 以定义一系列状态,由消息驱动状态进行迁移,参照图4,为本发明实施例中 的状态图,其中,服务调用图元(ServiceCall) 41可以表示对其他远程服务 的调用,如指定被调用对象和被调用方法,设置调用参数等,并且在继续迁移前已经接收返回值,下一状态可以直接使用返回值,所以从使用体验上看,和同步调用完全相同。服务调用图元有三种出口调用正常出口、调用异常 出口和调用超时出口,分别对应业务调用的三种结果下一状态42、异常处 理43和超时处理44。如果在状态图中以同步调用的方式调用了远端方法体foo,其处理过程如 下在方法体F1内部采用异步方式发送foo请求后会中途退出方法体Fl,退 出前要把调用栈信息以及运行当前状态保存下来,然后释放当前进程,此时 线程可以继续处理其他调用,等到foo请求的应答消息到达后,调度线程再次 调度进入方法体Fl,此时要恢复上次退出时保存的调用栈信息和退出前所处 当前运行状态,然后从退出前状态继续执行后续逻辑,直到方法体F1的逻辑 结束并退出方法体F1。这里例举的仅仅是一种实现方案,可以理解的是,为了达到调用栈信息 保存和恢复的目的,并不仅限于此种方案。从该技术方案可以看出,通过在方法体内部采用异步调用方式发送调用 请求消息,在等待应答期间,线程被释放,可以处理别的调用请求,因此可 以保证系统的处理性能;同时,当接收到所述调用请求消息的应答消息后, 可以根据保存的调用栈信息直接恢复到退出所述方法体前所处运行当前状 态,继续执行后续逻辑,因此,后续逻辑可以直接应用当前方法体的调用结 果,对于开发人员来说,看到的只是该方法体的处理和后续逻辑的顺序执行, 执行逻辑并没有被打乱,因此,可以降低业务开发的复杂度,提高业务开发 效率。综上可知,本发明实施例可以兼顾系统处理性能与业务开发效率。以下通过具体的应用场景,对本发明实施例中分布式调用消息的方法进 行详细描述具体场景为类CDemoClass调用远端IF2接口 ,在类CDemoClass中的 方法体StateProcess中实现分布式调用,以下通过具体步骤进行详细说明步骤51、类CDemoClass启动后,进入方法体StateProcess的同时将自身 的一个Context成员m—StateContext传入作为Context类链表的根节点;步骤52、方法体StateProcess在方法体内部创建CStateProcessContext实例并保存在Context类链表上;步骤53、方法体StateProcess从初始状态开始迁移;步骤54、当方法体StateProcess迁移到方法体调用状态,此时需要调用远 端的IF2:: foo(int a)接口方法体;1) 首先产生一个本地代理IF2存根类型的对象,然后调用IF2存根的foo 方法体;2) 在IF2存根的方法体内部又会创建一个Context类实例并保存在 Context类链表上,然后进入foo方法体的状态机,该状态机有两个状态发 送请求状态和接收应答状态;3) 首先进入发送请求状态,按照异步调用方式构造一个调用请求消息并 通过软总线发送出去,发送后将当前运行状态设置为接收应答状态,并且需 要等待应答消息,然后退出方法体StateProcess,释放调度线程,此时所有的 调用栈信息都保存在Context类中。可以将被调用对象、方法体和调用参数等调用信息构造成调用请求消息 并发送。步骤55 、当收到软总线上返回的应答消息时,再次调进方法体StateProcess 内部,并根据应答消息的ID从Context链中找到当前Context对象并恢复上次 调用栈信息,从退出点继续执行,再次进入IF2存根的方法体,直接迁移到接 收请求状态,取出应答消息中的返回值返回;步骤56、继续执行后来处理逻辑,所述后续处理逻辑可以直接使用方法 体StateProcess调用的返回j直。可以看出,该实施例中由于在方法体StateProcess内部采用异步方式发送 调用请求消息,发送后将当前运行状态设置为接收应答状态,并且需要等待 应答消息,然后退出方法体StateProcess,释放调度线程,此时所有的调用栈 信息都保存在Context类中。当收到应答消息时,再次调进方法体StateProcess 内部,并根据应答消息的ID从Context链中找到当前Context对象并恢复上次 调用栈信息,从退出点继续执行,再次进入IF2存根的方法体,直接迁移到接收请求状态,取出应答消息中的返回值返回,并继续执行后来处理逻辑,所述后续处理逻辑可以直接使用方法体StateProcess调用的返回值。因此,在等 待应答期间,线程可以处理别的业务,不占用线程,与同步调用相比,可以 保证系统的处理性能;而对于开发人员来说,当接收到所述调用请求消息的 应答消息后,可以根据保存的调用栈信息直接恢复到退出所述方法体前所处 运行当前状态,继续执行后续逻辑,因此,后续逻辑可以直接应用当前方法 体的调用结果,对于开发人员来说,看到的只是该方法体的处理和后续逻辑 的顺序执行,执行逻辑并没有被打乱,因此,可以降低业务开发的复杂度, 提高业务开发效率。综上可知,该实施例所采用的调用消息的方法可以同时 兼顾系统的处理性能与业务开发效率。与上一实施例的不同之处在于,该技术方案采用了不同的调用栈信息保 存和恢复方法,该方法具体为首先定义一种用于保存上下文关系的辅助类 上下文(Context)类,事实上,可以对每个方法体生成对应的Context类,把方 法体的参数和局部变量作为该Context类的成员变量;在对应方法体中,对参 数和局部变量的访问全部转换为访问Context类的成员。并且,在进入方法体 时,都把该方法体的Context类对象链接到上一层方法体的Context类对象上, 由此可以形成一个Context链,所以即使中途退出以后还可以方便地找到整个 Context链。当进行分布式远程调用时,会把调用信息构造成请求消息,并通过软总 线发送,该消息由一个唯一的消息ID进行标识,将该消息ID存储在调用的 Context中;而应答消息的ID与前面发送的调用请求消息的ID是一致的,因 此,当应答消息返回时,可以根据应答消息的ID找到对应的Context对象, 再从中恢复出保存的调用栈信息。这里例举的仅仅是一种实现方案,可以理解的是,为了达到调用栈信息 保存和恢复的目的,并不仅限于此种方案。领i或晋通寸支术人贝可。 是可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算积』可读存储介质中,该程序在执行时,包括如下步骤在方法体内部釆用异步方式发送调用请求消息;保存所述调用请求消息的调用栈信息及运行当前状态并退出所述方法体;当接收到所述调用请求消息的应答消息时,恢复保存的所述调用栈信息;根据恢复的调用栈信息,恢复到退出所述方法体前所处运行当前状态, 继续执行后续逻辑。上述提到的存储介质可以是只读存储器,磁盘或光盘等。以上对本发明所提供的一种分布式调用消息的方法和装置进行了详细介 绍,对于本领域的一般技术人员,依据本发明实施例的思想,在具体实施方 式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本 发明的限制。
权利要求
1.一种分布式调用消息的方法,其特征在于,包括在方法体内部采用异步方式发送调用请求消息;保存所述调用请求消息的调用栈信息及运行当前状态并退出所述方法体;当接收到所述调用请求消息的应答消息时,恢复保存的所述调用栈信息;根据恢复的调用栈信息,恢复到退出所述方法体前所处运行当前状态,继续执行后续逻辑。
2. 如权利要求1所述的分布式调用消息的方法,其特征在于,在在退出 所述方法体之前进一步包括将所述方法体运行当前状态设置为接收应答状态。
3. 如权利要求1所述的分布式调用消息的方法,其特征在于,保存所述 调用请求消息的调用栈信息具体为保存所述调用请求消息的标识和对应的 调用栈信息;恢复保存的所述调用栈信息具体为根据接收到的所述调用请求消息的 应答消息的标识,查找保存有相同标识的调用栈信息并恢复,其中,预设所 述应答消息的标识与调用请求消息 一致。
4. 如权利要求1所述的分布式调用消息的方法,其特征在于,保存所述 调用请求消息的调用栈信息的方法具体为将调用请求消息的标识及调用栈信息保存在预设的上下文类中,所述上 下文类中类对象与方法体——对应,且所述方法体对应的类对象^T连接到上一 层方法体的类对象上形成上下文类链表;所述恢复保存的调用栈信息具体为查找与所述应答消息的标识一致的 上下文类对象,再将保存的该类对象对应的调用栈信息恢复。
5. 如权利要求1至4所述的分布式调用消息的方法,其特征在于,所述 保存的调用栈信息包括祐匸调用对象、方法体、调用参数。
6. 如权利要求1至4所述的分布式调用消息的方法,其特征在于,所述执行后续逻辑具体为执行后续正常逻辑、执行超时处理逻辑或者执行异常 处理逻辑其中之一。
7. —种分布式处理装置,其特征在于,包括消息调用单元和信息处理 单元,其中所述消息调用单元包括消息发送单元、信息存储单元、栈信息维护单 元、消息接收单元,其中消息发送单元,在方法体内部釆用异步方式发送调用请求消息;消息接收单元,接收所述调用请求消息的应答消息;信息存储单元,保存调用栈信息和所述方法体运行当前状态;栈信息维护单元,当所述消息发送单元发送调用请求消息后将所述调用 请求消息的调用栈信息和运行当前状态保存到信息存储单元并退出所述方法 体;在消息接收单元接收到应答消息时,将保存在信息存储单元的调用栈信 息恢复;信息处理单元,根据栈信息维护单元恢复出的栈信息,恢复到退出所述 方法体前所处运行当前状态,继续执行后续逻辑。
全文摘要
本发明公开了一种分布式调用消息的方法和装置。本发明方法包括在方法体内部采用异步方式发送调用请求消息;保存所述调用请求消息的调用栈信息及运行当前状态并退出所述方法体;当接收到所述调用请求消息的应答消息时,恢复保存的所述调用栈信息;根据恢复的调用栈信息,恢复到退出所述方法体前所处运行当前状态,继续执行后续逻辑。以上方法和相应的处理装置能够同时兼顾系统的处理性能和业务开发效率。
文档编号H04L29/08GK101262498SQ20081009461
公开日2008年9月10日 申请日期2008年4月22日 优先权日2008年4月22日
发明者凯 丁, 李战杰, 海 申 申请人:华为技术有限公司
再多了解一些
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1