Главная / Программирование /
Построение распределенных систем на Java / Тест 7
Построение распределенных систем на Java - тест 7
Упражнение 1:
Номер 1
Какие из следующих утверждений являются верными:
Ответ:
 (1) технология CORBA
могут быть использованы только в том случае, если компоненты распределенной системы написаны на Java
 
 (2) технология CORBA
не накладывают ограничения на язык программирования, используемый для разработки компонентов распределенной системы, однако требуется, чтобы он был объектно-ориентированный 
 (3) технология CORBA
не накладывают ограничения на язык программирования, используемый для разработки компонентов распределенной системы, не требуется также, чтобы он был объектно-ориентированный 
Номер 2
CORBA
это:
Ответ:
 (1) коммерческий продукт, разрабатываемый компанией Sun
 
 (2) часть технологии Java
, которая может быть использована для создания распределенных систем, выполненных исключительно с использованием технологии Java
 
 (3) стандарт, определяющий различные аспекты взаимодействия компонентов распределенных систем и общие сервисы, существует множество реализаций этого стандарта 
Номер 3
CORBA
может быть использована при разработке:
Ответ:
 (1) только таких распределенных систем, все компоненты которых написаны на Java
 
 (2) только в том случае, если взаимодействующие компоненты выполняются на узлах с одинаковой аппаратной платформой 
 (3) только в том случае, если вызываемые удаленно методы принимают параметры только простых, системных типов данных 
Упражнение 2:
Номер 1
IDL
это:
Ответ:
 (1) инструментальное средство, преобразующее байт-код Java
к виду, который позволяет использовать CORBA
для вызова удаленных методов 
 (2) специальный язык, который позволяет описывать интерфейсы компонентов, взаимодействующих посредством механизмов CORBA
 
 (3) сервис именования CORBA
, разрешающий имя сервиса в объектную ссылку 
Номер 2
Файл, с IDL
-описанием может содержать:
Ответ:
 (1) описание интерфейсов компонентов 
 (2) описание реализации компонентов 
 (3) описание типов данных 
Номер 3
Объектная ссылка в CORBA
это:
Ответ:
 (1) указатель на объект в локальной памяти клиента 
 (2) указатель на объект в локальной памяти сервера 
 (3) специальный описатель, который позволяет брокеру запросов установить местонахождение удаленного объекта и выполнить вызов его метода 
Упражнение 3:
Номер 1
В классе BillingServiceImpl
для удаленного вызова доступны следующие методы:
Ответ:
 (1) конструктор 
 (2) addNewCard
 
 (3) getCardBalance
 
Номер 2
Утилита idlj
:
Ответ:
 (1) формирует описание удаленного интерфейса из исходного кода класса 
 (2) автоматически формирует на основании файла описания idl
вспомогательные классы, которые затем используются как на стороне клиента, так и на стороне сервера 
 (3) требует для своей работы исходного кода для класса, реализующего удаленный интерфейс 
Номер 3
Класс BillingServiceImpl
:
Ответ:
 (1) реализовывает методы, определенные для интерфейса BillingService
в файле idl
-описания 
 (2) является классом, методы экземпляра которого могут быть вызваны удаленно 
 (3) наследует от класса BillingServicePOA
, который был сформирован автоматически утилитой idlj
из idl
-описания 
Упражнение 4:
Номер 1
Почему в коде BillingServiceImpl
отсутствуют операторы чтения данных из сети?
1 // BillingServiceImpl.java
2 package com.asw.corba.ex1;
3
4 // базовые пакеты Java
5 import java.util.Hashtable;
6
7 import com.asw.corba.ex1.BillingServiceModule.*;
8
9 // пакеты OMG CORBA
10 import org.omg.CORBA.*;
11
12 public class BillingServiceImpl extends BillingServicePOA {
13 private ORB orb;
14 private Hashtable hash = new Hashtable();
15
16 public void setORB(ORB orb_val) {
17 orb = orb_val;
18 }
19
20 public void addNewCard(String personName, String card) {
21 hash.put(card, new Double(0.0));
22 }
23
24 public void addMoney(String card, double money) {
25 Double d = (Double)hash.get(card);
26
27 if (d!=null) hash.put(card,new Double(d.doubleValue()+money));
28 }
29
30 public void subMoney(String card, double money) {
31 Double d = (Double)hash.get(card);
32
33 if (d!=null) hash.put(card,new Double(d.doubleValue()-money));
34 }
35
36 public double getCardBalance(String card) {
37 Double d = (Double)hash.get(card);
38
39 if (d!=null) return d.doubleValue();
40 else return 0;
41 }
42 }
Ответ:
 (1) чтение из сети осуществляется в коде класса BillingServicePOA
, сформированного автоматически утилитой idlj
 
 (2) класс BillingServiceImpl
должен быть дополнен операторами чтения из сети 
 (3) чтение осуществляется в строке 17 
Номер 2
В какой строке кода BillingServiceImpl
происходит чтение из сети аргументов, передаваемых в метод addNewCard
:
1 // BillingServiceImpl.java
2 package com.asw.corba.ex1;
3
4 // базовые пакеты Java
5 import java.util.Hashtable;
6
7 import com.asw.corba.ex1.BillingServiceModule.*;
8
9 // пакеты OMG CORBA
10 import org.omg.CORBA.*;
11
12 public class BillingServiceImpl extends BillingServicePOA {
13 private ORB orb;
14 private Hashtable hash = new Hashtable();
15
16 public void setORB(ORB orb_val) {
17 orb = orb_val;
18 }
19
20 public void addNewCard(String personName, String card) {
21 hash.put(card, new Double(0.0));
22 }
23
24 public void addMoney(String card, double money) {
25 Double d = (Double)hash.get(card);
26
27 if (d!=null) hash.put(card,new Double(d.doubleValue()+money));
28 }
29
30 public void subMoney(String card, double money) {
31 Double d = (Double)hash.get(card);
32
33 if (d!=null) hash.put(card,new Double(d.doubleValue()-money));
34 }
35
36 public double getCardBalance(String card) {
37 Double d = (Double)hash.get(card);
38
39 if (d!=null) return d.doubleValue();
40 else return 0;
41 }
42 }
Ответ:
 (1) 17 
 (2) 21 
 (3) в коде класса BillingServiceImpl
нет операторов, осуществляющих чтение передаваемых клиентом аргументов из сети 
Номер 3
В какой строке кода BillingServiceImpl
осуществляется прием клиентского соединения:
1 // BillingServiceImpl.java
2 package com.asw.corba.ex1;
3
4 // базовые пакеты Java
5 import java.util.Hashtable;
6
7 import com.asw.corba.ex1.BillingServiceModule.*;
8
9 // пакеты OMG CORBA
10 import org.omg.CORBA.*;
11
12 public class BillingServiceImpl extends BillingServicePOA {
13 private ORB orb;
14 private Hashtable hash = new Hashtable();
15
16 public void setORB(ORB orb_val) {
17 orb = orb_val;
18 }
19
20 public void addNewCard(String personName, String card) {
21 hash.put(card, new Double(0.0));
22 }
23
24 public void addMoney(String card, double money) {
25 Double d = (Double)hash.get(card);
26
27 if (d!=null) hash.put(card,new Double(d.doubleValue()+money));
28 }
29
30 public void subMoney(String card, double money) {
31 Double d = (Double)hash.get(card);
32
33 if (d!=null) hash.put(card,new Double(d.doubleValue()-money));
34 }
35
36 public double getCardBalance(String card) {
37 Double d = (Double)hash.get(card);
38
39 if (d!=null) return d.doubleValue();
40 else return 0;
41 }
42 }
Ответ:
 (1) 17 
 (2) за прием клиентского соединения отвечает брокер, сам класс напрямую клиентское соединение не принимает 
 (3) класс BillingServiceImpl
должен быть дополнен операторами приема клиенсткого соединения 
Упражнение 5:
Номер 1
Для запуска системы из клиента и сервера (BillingServiceServer
и BillingClient
), необходим запуск:
Ответ:
 (1) tnameserv
, интерпретатора Java
с запущенным BillingServiceServer
, интерпретатора Java
с запущенным BillingClient
 
 (2) интерпретатора Java
с запущенным BillingServiceImpl
, интерпретатора Java
с запущенным BillingClient
, запуск tnameserv
обязательным не является 
 (3) tnameserv
, интерпретатора Java
с запущенным BillingClient
. Запуск BillingServiceImpl
произойдет автоматически при первом запросе клиента 
Номер 2
В строке 41, в классе BillingServiceServer
:
1 // BillingServiceServer.java
2 package com.asw.corba.ex1;
3
4 // пакеты OMG CORBA
5 import org.omg.CosNaming.*;
6 import org.omg.CORBA.*;
7 import org.omg.PortableServer.*;
8 import org.omg.PortableServer.POA;
9 import com.asw.corba.ex1.BillingServiceModule.*;
10
11 public class BillingServiceServer {
12 public static void main(String args[]) {
13 try{
14 // create and initialize the ORB
15 ORB orb = ORB.init(args, null);
16
17 // get reference to rootpoa & activate the POAManager
18 POA rootpoa =
19 POAHelper.narrow(orb.resolve_initial_references("RootPOA"));
20 rootpoa.the_POAManager().activate();
21
22 // create servant and register it with the ORB
23 BillingServiceImpl BSImpl = new BillingServiceImpl();
24 BSImpl.setORB(orb);
25
26 // get object reference from the servant
27 org.omg.CORBA.Object ref = rootpoa.servant_to_reference(BSImpl);
28 BillingService href = BillingServiceHelper.narrow(ref);
29
30 // get the root naming context
31 // NameService invokes the name service
32 org.omg.CORBA.Object objRef =
33 orb.resolve_initial_references("NameService");
34 // Use NamingContextExt which is part of the Interoperable
35 // Naming Service (INS) specification.
36 NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);
37
38 // bind the Object Reference in Naming
39 String name = "BillingService";
40 NameComponent path[] = ncRef.to_name( name );
41 ncRef.rebind(path, href);
42
43 System.out.println("BillingServiceServer ready and waiting ...");
44
45 // wait for invocations from clients
46 orb.run();
47 }
48
49 catch (Exception e) {
50 System.err.println("ERROR: " + e);
51 e.printStackTrace(System.out);
52 }
53 System.out.println("BillingServer Exiting ...");
54 }
55 }
Ответ:
 (1) производится связывание имени сервиса с экземпляром объекта, реализующим сервис 
 (2) создается экземпляр объекта, который может принимать удаленные вызовы 
 (3) производится останов сервиса 
Упражнение 6:
Номер 1
Класс BillingServiceServer
:
Ответ:
 (1) создает экземпляр класса BillingServiceImpl
, принимающего удаленные вызовы, и регистрирует его в сервисе имен 
 (2) является классом, экземпляр которого принимает удаленные вызовы 
 (3) принимает удаленные вызовы от клиента и перенаправляет их BillingServiceImpl
 
Номер 2
В строке 32 , в классе BillingServiceServer
:
1 // BillingServiceServer.java
2 package com.asw.corba.ex1;
3
4 // пакеты OMG CORBA
5 import org.omg.CosNaming.*;
6 import org.omg.CORBA.*;
7 import org.omg.PortableServer.*;
8 import org.omg.PortableServer.POA;
9 import com.asw.corba.ex1.BillingServiceModule.*;
10
11 public class BillingServiceServer {
12 public static void main(String args[]) {
13 try{
14 // create and initialize the ORB
15 ORB orb = ORB.init(args, null);
16
17 // get reference to rootpoa & activate the POAManager
18 POA rootpoa =
19 POAHelper.narrow(orb.resolve_initial_references("RootPOA"));
20 rootpoa.the_POAManager().activate();
21
22 // create servant and register it with the ORB
23 BillingServiceImpl BSImpl = new BillingServiceImpl();
24 BSImpl.setORB(orb);
25
26 // get object reference from the servant
27 org.omg.CORBA.Object ref = rootpoa.servant_to_reference(BSImpl);
28 BillingService href = BillingServiceHelper.narrow(ref);
29
30 // get the root naming context
31 // NameService invokes the name service
32 org.omg.CORBA.Object objRef =
33 orb.resolve_initial_references("NameService");
34 // Use NamingContextExt which is part of the Interoperable
35 // Naming Service (INS) specification.
36 NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);
37
38 // bind the Object Reference in Naming
39 String name = "BillingService";
40 NameComponent path[] = ncRef.to_name( name );
41 ncRef.rebind(path, href);
42
43 System.out.println("BillingServiceServer ready and waiting ...");
44
45 // wait for invocations from clients
46 orb.run();
47 }
48
49 catch (Exception e) {
50 System.err.println("ERROR: " + e);
51 e.printStackTrace(System.out);
52 }
53 System.out.println("BillingServer Exiting ...");
54 }
55 }
Ответ:
 (1) производится получение объектной ссылки на корневой раздел имен 
 (2) производится получение объектной ссылки на объект, реализующий сервис BillingService
 
 (3) производится создание корневого раздела имен 
Упражнение 7:
Номер 1
Какие из следующих утверждений являются верными:
Ответ:
 (1) при использовании CORBA
, для вызова метода удаленного объекта, клиент должен явно указать сетевой адрес узла, на котором выполняется удаленный объект 
 (2) имея объектную ссылку (полученную каким-либо образом), клиент для вызова метода удаленного объекта обязан иметь действующее подключение к сервису именования 
 (3) объектная ссылка для зарегистрированного в сервисе именования объекта может быть получена по имени объекта, указанному при его регистрации  
Номер 2
Какие из следующих утверждений являются верными:
Ответ:
 (1) не существует возможности зарегистрировать один и тот же объект в сервисе именований под разными именами 
 (2) раз зарегистрированный под определенным именем в сервисе именований объект, не может быть заменен на другой объект (под этим же именем) 
 (3) раз зарегистрированный под определенным именем в сервисе именований объект не может быть из него удален 
Номер 3
Сервис именования CORBA
это:
Ответ:
 (1) сервис, обеспечивающий получение объектной ссылки по имени объекта 
 (2) сервис, генерирующий уникальные имена для объектов по задаваемому пользователем правилу 
 (3) сервис именования не входит в спецификацию CORBA
и является расширением, реализуемым компанией Sun
 
Упражнение 8:
Номер 1
Какие из следующих утверждений являются верными:
Ответ:
 (1) использование IDL
- единственный способ определить интерфейс объекта, объект, не имеющий IDL
-описания, физически не может быть зарегистрирован в сервисе имен 
 (2) использование IDL
- единственный способ создать клиента для вызова методов удаленного объекта,  
 (3) использование IDL
для определения интерфейсов и создания как серверов, так и клиентов, обязательным не является 
Номер 2
Какие из следующих утверждений являются верными:
Ответ:
 (1) не существует возможности зарегистрировать один и тот же объект в сервисе именований под разными именами 
 (2) раз зарегистрированный под определенным именем в сервисе именований объект, не может быть заменен на другой объект (под этим же именем) 
 (3) раз зарегистрированный под определенным именем в сервисе именований объект не может быть из него удален 
Номер 3
Роль "клиентской заглушки" автоматически создаваемой утилитой idlj
состоит в:
Ответ:
 (1) упаковке получаемых при вызове ее методов аргументов, передаче их серверу, приемке и распаковке результатов 
 (2) разрешении имени удаленного объекта в объектную ссылку 
 (3) обеспечении компиляции клиентского класса, до того момента, пока заглушка не будет заменена разработчиком на полнофункциональный модуль 
Упражнение 9:
Номер 1
Для определения интерфейса удаленного объекта, в IDL
используется ключевое слово:
Ответ:
 (1) interface
 
 (2) module
,  
 (3) object
 
Номер 2
Роль "серверной заглушки" автоматически создаваемой утилитой idlj
состоит в:
Ответ:
 (1) приемке и распаковке параметров, переданных объектным брокером, вызов соответствующих методов целевого объекта, передача результатов обратно объектному брокеру 
 (2) регистрации удаленного объекта в сервисе именования 
 (3) обеспечении компиляции серверного класса, до того момента, пока заглушка не будет заменена разработчиком на полнофункциональный модуль 
Номер 3
При объявлении методов в IDL
, типы передаваемых в них аргументов должны:
Ответ:
 (1) быть системными, создание пользовательских типов данных не допускается 
 (2) быть либо системными, либо определенными как struct
- использование в качестве типа передаваемого аргумента ранее определенных интерфейсов - недопустимо 
 (3) в качестве типов аргументов могут быть использованы как системные типы, так и типы определенные пользователем, в том числе - интерфейсы 
Упражнение 10:
Номер 1
API
динамических вызовов используется:
Ответ:
 (1) клиентами, для вызова удаленных методов, чьи сигнатуры не известны на момент компиляции 
 (2) серверами, для динамического определения интерфейса (набора методов, которые могут удаленно вызываться клиентами),  
 (3) серверами, для вызова удаленных методов других серверов 
Номер 2
Динамические скелетоны используются:
Ответ:
 (1) клиентами, для вызова удаленных методов, чьи сигнатуры не известны на момент компиляции 
 (2) серверами, для динамического определения интерфейса (набора методов, которые могут удаленно вызываться клиентами),  
 (3) серверами, для вызова удаленных методов других серверов 
Номер 3
Какие из следующих утверждений являются верными:
Ответ:
 (1) API динамических вызовов не может использоваться совместно с API динамических скелетонов 
 (2) при использовании API динамических вызовов, становится недоступным использование сервиса именования 
 (3) API динамических вызовов позволяют написать клиентское приложение без использования IDL-описания и утилиты idlj