Corba服务器端的多线程有很多,但我对客户端感兴趣。我们有一个多线程客户端(Solaris,Orbix 6.3)和一个Corba单例"经理"初始化ORB。在运行期间' lsof'只显示与Corba服务器的一个TCP连接,因此应该序列化从客户端工作线程进行的所有同步调用。
想要改变这种安排以利用并行性:每个线程来管理自己的连接。我已经更改了设置,以便每个工作线程调用ORB_init()等代替单例。
现在完全困惑:' lsof'现在显示2个TCP连接,但有6个工作线程。 有些东西是不对的,预计会有多少个TCP连接作为工作线程的数量。可能是这种方法很幼稚 - 例如,每个线程调用ORB_init()是否有意义?
我需要有人对此提出意见。多线程客户端的示例代码会有很大帮助。再次,在Solaris上使用Orbix 6.3。
亲切的问候,
阿德里安
答案 0 :(得分:1)
连接管理是针对普通CORBA的特定实现。每个供应商都有自己专有的配置行为方式。如果您检查RTCORBA规范,那么它具有标准化的方法来配置如何使用客户端和服务器之间的连接。
我不知道Orbix如何工作以及它是否支持RTCORBA,这可能是你可以从他们的手册中获得的。我知道TAO对客户端的线程有很多支持。默认情况下,当多个线程调用同一服务器时,可以在同一时刻打开多个tcpip传输。
答案 1 :(得分:1)
谢谢你们的回答。我发现,正如Johnny所说,这确实是特定于实现的。
omniORB 有例如maxGIOPConnectionPerServer - 默认5.这是: ORB将向单个服务器打开的最大并发连接数。如果客户端上的多个线程调用同一服务器,则ORB将打开与服务器的其他连接,最多为此参数指定的最大值。如果达到最大值,则会阻止线程,直到连接空闲,供他们使用。
不幸的是,我还没有找到 Orbix 的等价物(如果有的话)。这肯定是默认为1连接。谷歌搜索......
虽然作为Solaris的一部分发现 - > Linux迁移将在几个月后从Orbix迁移到 TAO 。希望TAO更加友好和可定制。
答案 2 :(得分:1)
Orbix内部使用了大量优化例程来确保有效地使用连接。具体而言,它不会打开到同一服务器端点的多个连接,因为它能够通过同一TCP连接复用多个并发GIOP请求。 CORBA故意隐藏客户端和服务器程序员的连接管理。
我不相信这可以通过配置来控制。向Progress Support发送支持请求以进行确认。如果您离开单例模型并为每个客户端初始化不同的ORB(每个客户端都有自己的唯一ID),您可能会强制它发生,但对于一个问题来说,这将是一个非常苛刻和昂贵的解决方案。有点模糊。底层ORB已经构建为优化并发请求,所以我不确定你要解决的是什么问题。
答案 3 :(得分:0)
我不知道Orbix究竟是如何工作的,但通常ORB初始化只进行一次,即使对于多线程设置也是如此。多线程(服务器端)ORB将启动一定数量的工作线程(按需或根据需要或配置固定数量)来处理进程连接。这些连接由工作人员处理。该工作者查找可以处理此请求的服务方。通常这个(对服务员的真正调用)也在一个额外的线程中执行。但是你不会在lsof
看到这个帖子。请尝试使用ps -eLf
或top -H
并启用线程支持。
修改强>
在客户端,它取决于您要调用多少个对象。对于每个对象,可以使用调用者线程。每个远程对象也可以有多个调用程序线程,但只有在客户端逻辑上从不同线程调用时才有。 (想象一下,有多个线程,并且跨线程共享远程对象)
答案 4 :(得分:0)
在我的诚实意见中,我认为没有一种称为CORBA应用程序的多线程客户端的概念。因为在服务器端,有only one object
向命名服务注册,该服务可供所有客户端使用。如果查看对象的IOR
,则对所有客户端都是相同的。因此它最多只能建立一个与该对象的连接。它还会导致您认为不能为任意数量的客户端获取多个远程对象(这意味着您从不同客户端查找对象的次数,它们都获得相同的引用)。因此,为了支持多线程,服务器实际上必须支持不同的线程策略。 POA服务器可以有不同的线程策略。请仔细阅读JAVA PROGRAMMING WITH CORBA。