我最近开始着手我的第一个 CORBA 项目。我想我已经掌握了基本的东西,但是有些东西仍然让我难以理解。其中之一就是 CORBA 如何处理对同一对象的多次调用。
假设我有一个客户端向服务器注册,然后可以接收工作。服务器随机发送工作。
所有这些调用都在同一个线程上处理吗?这意味着当客户端正在工作时,它无法接收任何东西。在这种情况下,我怎么能给他一个多线程行为。
- 或者另一方面,是否为每个收到的调用生成一个线程?。在这种情况下,我是否需要保护每次调用都可以访问的公共(public)数据?这样做的好习惯是什么
我想做的另一件事是创建几个工作人员并让他们接受工作,但在我的实现中只有一个工作人员处于 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_MODEL
或 SINGLE_THREAD_MODEL
。前者未指定任何线程,ORB 实现决定使用哪种线程模型。后者保证对象接收到的每个请求(在同一个 POA 内)都是序列化的,因此不必在 servant 中实现重入或多线程功能。
然而,CORBA 实现者注意到了这个限制并实现了一些标准的默认策略,这些策略必须通过其他方式进行配置(可能是通过 ORB.init()
或配置文件的程序选项)。通常,您可以找到三种不同的策略(选择 ORB_CTRL_MODEL
后):
- 每个请求线程:每个请求生成一个新线程。
- 每个客户端的线程:为每个不同的客户端生成一个新线程。
- 线程池:ORB 预先分配一些线程池并使用它们来处理所有请求。
其他可能,但这些往往是共同点。当然,它们中的任何一个都会迫使您使用任何类型的锁定策略来支持并发客户端。
关于java - CORBA 不清楚的东西,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4432821/