利用动态调用方式实现分布式应用(上)
(本文转载自软件工程专家网www.21cmm.com)
苏洋
CORBA规范中定义动态调用接口(Dynamic Invocation Interface,DII)和动态骨架接口(Dynamic Skeleton Interface,DSI)的目的在于增加分布式应用程序设计的灵活性。
通常,基于客户端存根程序的情况下,需要预先知道被调用方法的名称、参数、返回值类型等信息。但是,在实际应用中往往在设计客户端应用时,不知道服务对象实现的具体细节,甚至服务对象实例还没有被创建。根据这种情况,CORBA定义了另外一种客户对象调用服务对象实现方法的方式:客户端以动态调用接口(DII)方式实现,而服务对象以动态骨架接口(DSI)形式创建。这样,在分布式应用程序设计时,很大程度上减少了客户端应用程序创建时对服务对象的依赖程度,提高了分布式应用程序设计的灵活性。
客户端动态调用接口(DII)
动态调用方式下创建客户端和服务对象实现应用时不再依靠桩程序和骨架程序对服务对象的引用。因此,在IDL到Java语言映射过程中需要指定映射工具的动态调用映射选项“-dynamic_marshal”,在VisiBroker中映射的方式为:
idl2java -dynamic_marshal filename.idl
在创建基于动态调用的分布式应用程序的客户端应用时,在客户端应首先创建请求(Request)对象,并在请求对象中指定服务对象中方法名称以及应用的参数等。创建请求对象后,以同步形式或异步形式查询服务对象的运行情况,并在服务对象运行结束后解析返回结果,结束动态调用请求。
在动态调用方式下,客户端必须向服务对象提出服务请求(Request)。Request对象代表客户对象向服务对象提出调用请求。创建Request对象的方式有两种:一是通过对调用对象的引用,用被引用对象的_request方法创建Request对象,然后调用Request对象的add_value方法添加方法调用需要的参数; 另一种方式是调用被引用对象的_create_request方法来创建对服务对象的调用请求。利用_request方法创建请求对象的例子代码为:
org.omg.CORBA.Request request = serverObject._request(“getName”)
在上面的代码中创建的请求对象用于调用服务对象的名称为getName的方法。
服务请求由对服务对象的引用、要调用的服务对象方法名称和参数列表构成。请求的参数以元素列表的形式实现,其中元素是NamedValue结构类型的实例,该结构定义如下:
typedef unsigned long Flags;
struct NamedValue
{
Identifier name;
any argument;
long len;
Flags arg_modes;
}
其中参数的意义分别为加入列表中的元素的名称、变量值、变量长度和参数的模式标识。
CORBA为动态调用接口定义了很多方法,用于在客户端创建调用请求、查询返回结果和对返回结果进行解析等。下面介绍常用的客户端实现动态调用的方法:
1. void create_request( in Context ctx,
in Identifier operation,
in NVList arg_list,
inout NamedValue result,
out Request request,
in Flags req_flags)
其中参数分别为调用请求应用的context对象、调用的方法名称、调用方法的参数、调用返回结果、新的返回请求和请求标志等。
2. boolean poll_response( in Request req)
其中的参数req为用户创建的服务请求。该方法用于查询在以异步形式向服务对象发送的服务请求的完成情况。返回TRUE说明请求已经完成,否则说明未完成。
3. get_response() raises (WrongTransaction)
该方法用于查询以同步方式向服务对象发送的服务请求的完成情况。方法返回调用请求的结果。如果服务对象端的被调用方法没有完成,则get_response方法一直等待直至请求完成。
类似的方法还有get_next_response,用于在客户端发送多个调用请求的情况下查询下一个请求的执行情况。
服务对象动态骨架接口(DSI)
服务对象动态骨架接口(DSI)位于服务对象端,用于动态处理客户端提出的服务请求。动态骨架接口通过对象适配器接收客户端服务请求,并将该请求传递给服务对象实现。
在处理客户请求时,服务对象实现不去分析客户是使用桩方法还是动态调用接口来提出对象服务请求; 同时,发出调用的客户程序也不去分辨服务对象接收服务请求是不是通过服务对象骨架。
服务对象端CORBA对象结构如下图所示:
基于动态骨架接口的服务对象实现程序的编写步骤为:
● 以DynamicImplementation接口为父对象创建服务对象实现程序;
● 实现DynamicImplementation接口的invoke方法,应用接收客户对象提出的服务对象请求;
● 通过narrow方法获得对根POA的引用;
● 通过根POA的create_POA方法创建服务POA(POA Servant),在服务POA中指定服务对象方法的实现;
在创建服务对象实现程序时,必须实现抽象类DynamicImplementation中的invoke等方法。该类的定义为:
package org.omg.CORBA;
public abstract class DynamicImplementation
extends org.omg.CORBA.portable.ObjectImpl
{
public abstract void invoke(org.omg.CORBA.ServerRequest request);
}
可以看出:DynamicImplementation抽象类中定义了抽象方法invoke。该方法用于在服务对象实现程序中处理客户对象提出的服务请求。在该方法中,首先分析request实例中的调用方法名称,来分析客户提出的方法在服务对象实现端是否有定义。如果没有定义,则抛出BAD_OPERATION异常。其代码为:
if (!request.operation().equals(“getName”))
{
throw new org.omg.CORBA
.BAD_OPERATION();
}
上面的代码中,通过request对象的operation方法,分析需要调用的方法名称。因此,可以在程序中判断该方法是否在服务对象端有实现。在request请求的方法名称正确的情况下,服务对象实现端应用调用适合的方法来处理用户请求。
分享到:
相关推荐
【基于Redis实现分布式应用限流的方法】 限流是保护系统免受高并发访问或恶意攻击的重要手段,通过限制系统的处理速度或在特定时间窗口内处理的请求数量,防止系统资源耗尽导致服务崩溃。Redis,作为一款高效且广泛...
这些信息表明该文章主要探讨了如何利用Python Remote Objects来实现分布式对象应用系统的设计与实现,并且在研究过程中发挥Python Remote Objects的开放源码特性,旨在为分布式对象技术系统的基础设计和应用开发提供...
通过上述方式,我们能够利用Redis实现一个简单的分布式锁,从而防止方法重复调用,有效应对防刷单等并发控制场景。在实际应用中,还需要结合业务需求和系统特性,对锁的实现进行优化,以保证系统的稳定性和性能。
ASP.NET 分布式应用程序是构建在微软.NET框架之上的高级Web应用技术,它允许开发者创建高性能、可伸缩且能够处理大规模并发用户的网络应用。在ASP.NET中,分布式应用程序主要涉及多个独立运行的组件,它们可以分布在...
Java分布式应用是指利用Java编程语言构建的、运行在多台计算机上的应用程序。这些应用程序能够跨网络进行通信和数据交换,实现资源共享和协同工作。Java的平台独立性和丰富的库支持使得它成为开发分布式应用的理想...
**分布式应用与SOA实现** 在当今的互联网时代,分布式应用程序已经成为企业级系统构建的核心模式。分布式应用允许将复杂的业务逻辑拆分成多个独立的服务,这些服务可以分别部署、扩展和维护,极大地提高了系统的可...
第三,MSMQ(Microsoft Message Queuing)是另一种.NET下实现分布式应用的技术,它提供了消息队列服务,允许应用程序异步地发送和接收消息。MSMQ实现了一种“发后即忘”的消息传递模式,能够在发送和接收应用之间...
在分布式应用开发中,Indy 可用于实现跨网络的通信,如数据传输、远程方法调用(RPC)和实时消息传递。 使用Indy进行分布式应用开发时,你需要了解如何配置和使用各种组件,如TIdServer、TIdClient、...
利用ICE通信中间件构建分布式应用程序开发框架 ICE(Internet Communications Engine)是一种用于分布式程序设计的网络通信中间件。其设计目标是提供一个适用于异种环境的面向对象中间件平台,支持广泛的领域中的...
2. **分布式应用程序基础**:分布式应用程序涉及到客户端和服务器之间的交互,VB6.0通过DCOM技术允许对象在不同的进程中运行,实现了跨计算机的数据共享和功能调用。理解DCOM的工作原理和配置是开发分布式应用的基础...
Redisson的分布式锁是基于Redis实现的,利用Redis的高可用性、低延迟以及丰富的数据结构特性,可以有效地解决分布式环境下的锁问题。Redisson通过命令行接口(Command)将Java方法映射到Redis操作上,这样我们就可以...
Java分布式应用程序设计是一种构建大型、可扩展且高可用性系统的方法。在Java中,通过利用网络中的多台计算机,可以创建能够跨越多个节点共享资源、处理任务和存储数据的复杂应用。这种技术允许应用程序的不同部分在...
RMI允许一个Java对象调用运行在另一台机器上的对象的方法,就像调用本地对象一样简单。这对于构建分布式应用和服务尤其有用。 Java RMI的基本步骤包括: 1. **定义接口**:创建一个Java接口,声明远程方法。 2. **...
《NET分布式应用程序 集成XML Web服务与.NET远程处理》这本书深入探讨了.NET框架下构建...无论你是初学者还是经验丰富的开发者,都将从中受益匪浅,提升你的技能水平,助你在.NET分布式应用程序开发的道路上更进一步。
全书分为四个主要部分,全面覆盖了从基础的网络通信到复杂的系统架构设计的各个环节,旨在帮助读者掌握构建高性能、高可用和可伸缩分布式应用的关键技能。 第一部分:基于Java实现网络通信 这一部分详细阐述了Java...
在.NET Framework的基础上构建N层分布式应用是现代企业级软件开发中的常见实践。这种架构模式能够实现高度可扩展性、灵活性和模块化,从而提高代码的重用性和维护性。本篇将深入探讨如何利用.NET Framework的各项...
在本例中,我们构建了一个基于 RMI 的分布式应用实例,旨在演示如何利用 RMI 实现分布式任务处理。 #### 二、RMI的核心组成部分 ##### 1. 定位远程对象 - **名字服务功能**:RMI 提供了名字服务功能,如 `java.rmi...
总的来说,利用Python Remote Objects技术实现分布式对象应用系统,需要理解并掌握上述知识点,结合实际需求,设计出高效、可靠的分布式解决方案。通过熟练运用这些技术,你可以构建出跨网络的、可扩展的、健壮的...
由于提供的【部分内容】链接均指向同一网址,且无法从中提取具体信息,因此无法直接分析这些链接所包含的分布式Java应用的具体...学习和掌握这些知识能够帮助开发者设计和实现更加稳定、高效、可扩展的Java分布式应用。
自旋式加锁是一种常见的分布式锁实现方式。在Java中,我们可以创建一个`LockService`类,其中包含一个循环尝试获取锁的方法。当尝试获取锁失败时(即`SETNX`返回`false`),线程会进入循环等待一段时间后再次尝试,...