CORBA 不清楚的东西

Posted

技术标签:

【中文标题】CORBA 不清楚的东西【英文标题】:CORBA unclear stuff 【发布时间】:2010-12-13 19:44:49 【问题描述】:

我最近开始着手我的第一个 CORBA 项目。我想我已经掌握了基本的东西,但是有些东西仍然让我无法理解。其中之一是 CORBA 如何处理对同一个对象的多个调用。

假设我有一个向服务器注册自己的客户端,然后可以接收工作。服务器随机发送工作。

所有这些调用都在同一个线程上处理吗?这意味着当客户端工作时,它无法接收任何东西。在这种情况下,我怎么能给他一个多线程的行为。

或者另一方面是为收到的每个呼叫生成一个线程?在这种情况下,我是否需要保护可以在每次通话中访问的公共数据?这样做的好做法是什么

我想做的另一件事是创建几个工作人员并让他们接收工作,但在我的实现中只有一个工作人员处于活动状态。

下面:

public static void main(String[] args) 
       
  try
  
    connectWithServer(args);                
      createWorkers();              
      // wait for invocations from clients
      orb.run();
  
  catch (Exception e) 
  
       System.out.println("ERROR : " + e) ;
       e.printStackTrace(System.out);
   


static public void connectWithServer(String[] args)throws Exception

        orb = ORB.init(args, null);

        // get reference to rootpoa & activate the POAManager
        rootpoa = POAHelper.narrow(orb.resolve_initial_references("RootPOA"));
        rootpoa.the_POAManager().activate();

        // get the root naming context
        org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService");

        // Use NamingContextExt instead of NamingContext. This is
        // part of the Interoperable naming Service.
        NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);

        // resolve the Object Reference in Naming
        taskBagImpl = TaskBagHelper.narrow(ncRef.resolve_str(SERVER_NAME));       

        System.out.println(TAG + " Obtained a handle on server object: " + taskBagImpl);        
    



public static void createWorkers() throws Exception
    
        for(int i = 0; i < nrOfWorkers; i++)
        
             WorkerImpl w = new WorkerImpl();
             rootpoa.activate_object((Servant) w);
             Worker ref = WorkerHelper.narrow(rootpoa.servant_to_reference(w));

             w.setRef(ref);

             taskBagImpl.registerWorker(w.getId(), ref);            
        
    

【问题讨论】:

【参考方案1】:

CORBA 标准中没有指定线程选项。关于线程的唯一可能配置是 POA 策略ThreadingPolicy。可能的值为ORB_CTRL_MODELSINGLE_THREAD_MODEL。前者没有指定线程,而 ORB 实现决定使用哪个线程模型。后者保证对象接收的每个请求(在同一个 POA 内)都是序列化的,因此无需在服务方中实现重入或多线程功能。

然而,CORBA 实现者注意到了这个限制并实现了一些标准的默认策略,这些策略必须通过其他方式进行配置(可能是通过ORB.init() 或配置文件的程序选项)。通常,您可以找到三种不同的策略(选择ORB_CTRL_MODEL 后):

每个请求的线程:每个请求生成一个新线程。 每个客户端线程:为每个不同的客户端生成一个新线程。 线程池:ORB 预先分配了一些线程池并使用它们来处理所有请求。

其他是可能的,但这些往往是共同点。当然,它们中的任何一个都会迫使您使用任何类型的锁定策略来支持并发客户端。

【讨论】:

您能否在 sn-p 中告诉我如何设置“每个请求的线程”行为。或者也许给我一些其他资源。 这取决于您使用的具体 ORB 实现。例如,ORBacus 实现(您可以在此处阅读:documentation.progress.com/output/Iona/orbacus/4.3.4/…)说:-OAthread_per_client 选择每个客户端模型的线程。这个选项可以作为程序的命令行传递给ORB.init() 函数中的 ORB,或者使用配置文件,正如您也可以在 ORBacus 的文档中看到的那样。但是,正如我所说,这取决于您使用的具体 ORB。【参考方案2】:

请参阅此 Java IDL 常见问题解答:

What is the thread model supported by the CORBA implementation in this release?

【讨论】:

以上是关于CORBA 不清楚的东西的主要内容,如果未能解决你的问题,请参考以下文章

CORBA 实现的兼容性

使用 CORBA 时打印堆栈跟踪

Corba 与 Android Studio [关闭]

Corba 的 RMI 是不是有任何“远程异常”?

CORBA - JacORB:使用固定端口生成 IOR?

JMS 和 CORBA 的区别?