1. CORBA
问题 回答
a.) 一个客户是怎样连接到一个服务器? 这是众所周知的关于 CORBA 的问题(更精确的说法是在任何分布式对象系统中均存在这个问题)。它通常以术语"bootstrapping"(引导)描述。一般的说, 可以从名字服务( Name Service)(或者 Trading Object Service) 获得对象的引用, 但是名字服务自身也是对象(有赖于 CORBA 清晰的设计)。既然名字服务自身也是对象,你如何得到对它的引用呢?
一个客户的标准的解决方法是,通过交换可互操作对象引用(Interoperable Object Reference 缩写是 IOR)找到对一个服务器的第一个对象引用。服务器进程通过使用 object_to_string()方法产生一个已创建对象的 IOR。生成的字符串,也叫字符串化对象引用,可通过任何媒介传输,象 email、HTTP、NFS、文件系统,甚至是在浮瓶中的便条 ;-) 。客户进程从媒介中读取 IOR 并通过string_to_object()把它转换回原来的二进制表示。在此之后客户拥有了一个对服务器的有效的引用,这样就可以用通常的方式调用(invoke 也译为激发)方法。
直到现在,各种不同的 ORB 未能提出解决这个重要的引导问题的标准方式。一个例子是 Visibroker 位置服务。 ORB 通过一个专有的_bind()方法在一个中心的服务中登记每个对象。通过网络广播来发现服务。这种机制的缺点是有关对象的信息存储在一个中心表中 。这个表需要在规律性的基础上的更改。这是必须的,因为恶意的对象不彻底的去除登记。如果广播的间隔太短,更改将导致在网络上有大量的噪音 。如果广播的间隔太长,表中将包括僵尸对象。这种专有的解决方案在许多主要的 CORBA 实现中存在。
理想的方法是 resolve_initial_references(),它被用于找到一个命名服务的引用。这样 ORB 不要求开发者写一些额外的代码就可以读取 IOR。 在过去每个 ORB 用自己的命令行参数把 IOR 到 ORB 的核心。(ORBit: ORBNamingIOR=IOR:.....)。 可互操作命名服务 (Interoperable Naming Service 缩写为 INS) 定义(ptc/99-12-03) 引进了标准的命令行参数 -ORBInitRef 来完成这项工作。
yourclientapp -ORBInitRef NameService=IOR_of_naming_service
唯一的窍门是把 argc 和 argv 传递给 ORB 的 ORB_init()调用,这样 ORB 的核心就能展开有关参数,下面的调用之后
nsobj = resolve_initial_references("NameService");
返回想要的对象引用。INS 规范定义是除 IOR 之外的另一个可被人阅读的对象引用。
corbaloc:iiop://IIOPVersion@hostname:port/ObjectKey
corbaloc 通过提供可被人阅读的地址,给出了一个客户指向一个服务器对象的另一种可能的方式。提出另一个的方案是 corbaname,它查阅在主机上的命名服务,用 hostname 指定。
corbaname://hostname#a/b/obj
a/b/obj 指定一个名字,例如一个 NameComponents 的序列, 它用于解析一个对象引用。这种机制将极大的增进整个引导过程并最终解决问题,这在过去曾经是最闹心的重要问题。可被人阅读的对象引用 corbaloc 也有一些毛病。他们认为 INS 规范减轻了拥有晦涩的 IOR 的事实。指定协议的细节,象端口号或协议版本号,在用于传输的协议被交换时将导致引用变得无效。对象的 URL 必须被扩展来支持新协议的信息,而 IOR 是一个数字的序列,永远保持不变。
ORBit 的 CVS HEAD 版本部分的实现了 INS 规范(参见 NameService)。
Michi Henning 对这个问题的更详细的描述在 here。
b.) 我如何在 IDL 中指定缺省的参数? IDL 不允许指定缺省参数。有两个主要原因。首先, IDL 对所有的可得到的 COBRA 映射的语言提出最小的一般性限制。许多语言不支持缺省参数的概念,在映射时支持这个特征时就有困难。 其次,缺省的参数不是真正必须的。 一个接口的设计者可以轻易的把这样的功能分割成两个或更多的独立的方法(注意:重载也由于同样的原因而不被支持,所以方法必须有不同的名字)。
c.) 我如何得到 CORBA 中的客户/服务器对象的IP地址? IP 地址(包括端口号或其他任何协议相关的特征)隐藏在 IOR (Interoperable Object Reference)中。这种不透明的理由是 CORBA 在对象实例间可以使用任何协议用于传输。GIOP (General Inter ORB Protocol,通用 ORB 间协议)不依赖于任何特定网络协议 。IIOP (Internet Inter ORB Protocol,Internet ORB 间协议)把 GIOP 转换到 TCP/IP。 IIOP 支持不是 ORB 的强制性的特征,但是因为 Internet,它对于每个 ORB 都是必须实现的。 如果我们开始依赖于当前的一个特定协议,原始的打算就被削弱了,致使对象引用在当前有效将来无效。 (参见 TAO (The ACE ORB, ACE - Adaptive Communication Environment) 一个支持可插拔协议的 ORB)
Back to top
--------------------------------------------------------------------------------
2. ORBit
问题 回答
a.) 我如何安装某一版本的 ORBit 而不影响 GNOME桌面? 用以下命令配置软件包:
./configure --prefix=~/orbit_test_dir --exec-prefix=~/orbit_test_dir
这里的 orbit_test_dir 是一个任意的子目录。接着调用 make 和 make install, 他们把 ORBit 复制到指定目录。最后你只需要调整你的 PATH 和 LD_LIBRARY_PATH 环境变量,即分别的增加 ~/orbit_test_dir/bin 到 PATH 和 ~/orbit_test_dir/lib 到 LD_LIBRARY_PATH。
b.) 我不能连接到我的远程对象? GNOME security discussion 导致在缺省时禁止在IP服务器套接口上的IIOP(例如:端口)。使用 UNIX 域套接口或用进程间通信的共享内存来替代。 禁止在网络上的通信只用于防止系统被拒绝服务攻击。如果你打算在网络上使用 ORBit就需要再次允许它。 设置可以在 /etc/orbitrc (系统范围设置), 在 ~/.orbitrc (用户的设置), 或对每个应用程序给 ORB 传递一个参数。在前两个方式中你需要把 -ORBIIOPIPv4=1 放入某个 orbitrc 文件中。 控制对每个应用程序的设置通过为你的客户/服务器应用程序在命令行提供 -ORBIIOPIPv4=1 完成,并要传递 argc 和 argv 参数到 CORBA_ORB_init() 调用 (缺省处理)。
你可以用命令检查设置: netstat -ao | grep LISTEN。 不应该有任何 ORBit 相关的套接口处于被动打开(监听)的模式 (这样的一行: "unix 0 [ ACC ] STREAM LISTENING XXXX /tmp/orbit-USER/orb-YYYYYYYYYYYYYYYY" 不应出现)
c.) 我在那里能得到 ORBit 的 CVS HEAD 版本? gnome developer 站点描述了如何使用 anonymous CVS access。登录之后你需要键入 "cvs -z3 co ORBit", "ORBit" 是模块的名字。
d.)为什么在 CVS 版本和 GNOME 软件包之间有区别? TheGNOME 版本 1.2 的 Roadmap 要求 ORBit 二进制和源代码相容。所以在 ORBit 软件包上的更改在不违反这些要求的情况下是可以接受的。稳定的分支是 orbit-stable-0-5,新的特征被增加到 CVS HEAD。
e.) CORBA_ORB_init() 支持那些参数? CORBA 参数 (INS/Core spec 定义; 只在 ORBit 的 CVS HEAD 版本中能得到 )
-ORBid
用于选择所使用的 ORB 的标识符 (ORBit 稳定版和 ORBit HEAD 版只支持"orbit-local-orb"; ORBit-mt 版必须使用 "orbit-local-mt-orb")。
-ORBInitRef ObjectId=
初始的引用。参见 INS/CORBA2.4 spec 来得到进一步的信息。
-ORBDefaultInitRef
初始的引用前缀。参见 INS/CORBA2.4 spec 来得到进一步的信息。
ORBit 指定的参数(在 CVS HEAD 和 ORBit-stable-0-5 分支中可得到):
-ORBImplRepoIOR=
实现仓库的 IOR;应该被上面的标准参数所取代。
-ORBIfaceRepoIOR=
接口仓库的 IOR;应该被上面的标准参数所取代。
-ORBNamingIOR=
命名服务的 IOR;应该被上面的标准参数所取代。
-ORBDebugLevel=warning|message|info|debug|all
显示的调试信息的总量。等级 "warning", "message", "info", "debug" 可以组合使用,":"是分隔符。 "all" 用来选择所有信息。
-ORBDebugModules=ORB|CDR|IIOP|TC|IR
显示调试信息的模块。
-ORBIIOPUSock=0|1
禁止/允许 UNIX 域套接口。
-ORBIIOPIPv4=0|1
禁止/允许 IPv4 服务器套接口。
-ORBIPv4Port=#port
用于 IIOP 连接的被动打开的端口号,持久对象的引用需要这个参数(PortableServer_PERSISTENT 策略)。
-ORBIIOPIPv6=0|1
禁止/允许 IPv6 套接口。
f.) 何时、何人发起了本计划? 计划由 Elliot Lee 和 Dick Porter 在1998年2月发起。
Back to top
--------------------------------------------------------------------------------
3. 帮助
问题 回答
a.) 是否有邮件列表 HOWTO? 邮件列表 demon 提供一个关于如何使用的简短描述. 发送主题是"help"的 e-mail 到 mailto:orbit-list-request@NOSPAMgnome.org?subject=help&body=Remove NOSPAM from address ! 。
b.) 我如何订阅邮件列表? 到 mail.gnome.org/mailman/listinfo/orbit-list/.
c.) 我如何从订阅的邮件列表中退出? 到 mail.gnome.org/mailman/listinfo/orbit-list/.
d.) 我如何向邮件列表发eMail? 发送 e-mail 到 mailto:orbit-list@NOSPAMgnome.org?body=Remove NOSPAM from address !.
e.) 是否有邮件列表的档案? 在 mail.gnome.org/archives/orbit-list/能得到可查找的档案,但只包括2000年8月以前的。
可得到用于下在档案包:
orbit-list-archive-1998.tar.gz (#1: 21. March 1998 - #765: 31. December 1998, 517 kB)
orbit-list-archive-1999.tar.gz (#766: 1. January 1999 - #2472: 31. December 1999, 972 kB)
orbit-list-archive-2000.tar.gz (#2473: 1. January 2000 - #3385: 21. August 2000, 623 kB)
完整的档案包: orbit-list-archive.tar.gz (2112 kB)
用于检索邮件的 Perl 脚本在: ftp://orbit-resource.sourceforge.net
/pub/orbit-resource/spin-off/
f.) 我初学 CORBA.可得到那些书籍? 可得到很多书籍,主要的在线存储很受欢迎并且评论了市场上差不多所有的 CORBA 书籍。
CORBA books at fatbrain
CORBA books at TU Vienna (2000)
Cetus' CORBA - Books
JavaWorld's CORBA books
最好的书籍中的一本是 Michi Henning 和 Steve Vinoski 的: "Advanced CORBA Programming with C++" (ISBN 0-201-37927-9)。尽管标题显示的好象只是为 C++ 编程而写的,它包含了对许多基本概念的解释,对一般性的理解是有用的。(译注:中译本好象已经出版了,它的标题使我只看了一眼封面,所以不能确定)
g.) 可得到那些关于CORBA的新闻组? 常规的 CORBA 问题: comp.object.corba
Java CORBA 的问题: comp.lang.java.corba
Back to top