Я недавно начал работать над моим первым проектом 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);
}
}