CORBA непонятные вещи - PullRequest
       6

CORBA непонятные вещи

2 голосов
/ 13 декабря 2010

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

2 голосов
/ 13 декабря 2010

Опции потоков не указаны в стандарте CORBA.Единственная возможная конфигурация в отношении потоков - это политика POA ThreadingPolicy.Возможные значения: ORB_CTRL_MODEL или SINGLE_THREAD_MODEL.В первом ничего не говорится о потоках, а реализация ORB решает, какую модель потоков использовать.Последний гарантирует, что каждый запрос, который получает объект (в пределах того же POA), сериализуется, поэтому в слуге не нужно реализовывать возможности повторного входа или многопоточности.

Однако разработчики CORBA приняли к сведениюэтого ограничения и реализовал некоторые стандартные политики по умолчанию, которые должны быть настроены другими средствами (например, параметры программы через ORB.init() или файлы конфигурации).Обычно можно найти три разные политики (после выбора ORB_CTRL_MODEL):

  • Поток на запрос: порождает новый поток при каждом запросе.
  • Поток на клиента: порождает новыйпоток для каждого отдельного клиента.
  • Пул потоков: ORB предварительно выделяет некоторый пул потоков и использует их для обслуживания всех запросов.

Возможны и другие, но обычно ониобщий язык.Конечно, любой из них заставит вас использовать любую стратегию блокировки для поддержки одновременных клиентов.

0 голосов
/ 21 января 2011
...