我最近开始从事我的第一个CORBA项目。我认为我掌握了基本知识,但是有些事情仍然使我望而却步。其中之一是CORBA如何处理同一对象上的多个调用。

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

  • 是否所有这些调用都在同一线程上处理?这意味着在客户端工作时,它什么也收不到。在这种情况下,我怎么能给他一个多线程的行为。
  • 或者另一方面,是为收到的每个调用生成一个线程?在这种情况下,我是否需要保护每次调用都可以访问的公用数据?这样做是什么好习惯

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

    以下 :
    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);
            }
        }
    

    最佳答案

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

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

  • 每个请求的线程:每个请求都产生一个新线程。
  • 每个客户端线程:为每个不同的客户端生成一个新线程。
  • 线程池:ORB预分配了一些线程池,并使用它们来满足所有请求。

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

    关于java - CORBA不清楚的东西,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4432821/

    10-10 17:47