CORBA不清楚的东西

时间:2010-12-13 19:44:49

标签: java multithreading corba

我最近开始研究我的第一个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);            
        }
    }

2 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:0)