Главная / Программирование /
Построение распределенных систем на Java / Тест 5
Построение распределенных систем на Java - тест 5
Упражнение 1:
Номер 1
Какие из следующих утверждений являются верными:
Ответ:
 (1) Java RMI
может быть использована только в том случае, если все взаимодействующие компоненты системы разработаны с использованием Java
 
 (2) Java RMI
является универсальной технологией, она не накладывает никаких ограничений на технологии разработки взаимодействующих компонентов 
 (3) Java RMI
может использоваться только в том случае, если взаимодействующие компоненты выполняются на узлах с одинаковой аппаратной платформой 
Номер 2
Java RMI
может быть использована только в том случае, если:
Ответ:
 (1) все взаимодействующие компоненты распределенной системы выполнены на Java
 
 (2) между компонентами системы передаются данные только системных, встроенных типов, передача с помощью Java RMI
пользовательских типов данных невозможна 
 (3) все компоненты системы расположены на одном узле 
Номер 3
Какие из следующих утверждений являются верными:
Ответ:
 (1) Java RMI
при передаче в качестве параметров пользовательских объектов, для их передачи по сети использует механизм сериализации Java
 
 (2) Java RMI
не может быть напрямую использована в том случае, если необходимо связать компоненты, выполненные не на Java
 
 (3) для того, чтобы программа на Java
стала программой, использующей Java RMI
, ее необходимо откомпилировать с особым ключом компиляции. Никаких дополнительных действий - не требуется 
Упражнение 2:
Номер 1
Класс, методы экземпляра которого могут вызываться удаленно через Java RMI
должен:
Ответ:
 (1) реализовывать интерфейс, который наследует от интерфейса java.rmi.Remote
 
 (2) реализовывать интерфейс Serializable
 
 (3) наследовать от класса Thread
 
Номер 2
Определение удаленного интерфейса RMIExample
должно выглядеть следующим образом:
Ответ:
 (1) public interface RMIExample extends Remote
 
 (2) public interface RMIExample implements Remote
 
 (3) public interface RMIExample extends RMI.
 
Номер 3
Какие из следующих утверждений являются верными:
Ответ:
 (1) в удаленном интерфейсе, наследующим от java.rmi.Remote
, определяются те методы объекта, которые могут быть вызваны удаленно 
 (2) в удаленном интерфейсе, наследующим от java.rmi.Remote
, должны быть определены все методы объекта, как те, которые могут быть вызваны удаленно, так и остальные 
 (3) в удаленном интерфейсе, наследующим от java.rmi.Remote
, не должно быть определено ни одного метода. Те методы, которые могут быть вызваны удаленно, объект самостоятельно регистрирует в системе, после своего создания 
Упражнение 3:
Номер 1
Класс BillingServiceImpl
:
Ответ:
 (1) реализовывает методы, определенные в удаленном интерфейсе BillingService
 
 (2) является классом, методы экземпляра которого могут быть вызваны удаленно, посредством Java RMI
 
 (3) наследует от класса UnicastRemoteObject
, что позволяет передавать экземпляры BillingServiceImpl
по сети, используя механизм сериализации 
Номер 2
В классе BillingServiceImpl
для удаленного вызова посредством Java RMI
доступны следующие методы:
Ответ:
 (1) конструктор 
 (2) addNewCard
 
 (3) getCardBalance
 
Номер 3
Утилита rmic
:
Ответ:
 (1) формирует описание удаленного интерфейса 
 (2) требует для своей работы исходного кода для определения удаленного интерфейса 
 (3) требует для своей работы исходного кода для класса, реализующего удаленный интерфейс 
Упражнение 4:
Номер 1
Для того чтобы методы, определенные в удаленном интерфейсе могли принимать параметры типа "класс, определенный пользователем", необходимо:
Ответ:
 (1) определить класс, используемый в качестве типа для передаваемого параметра, как реализующий интерфейс Serializable
 
 (2) определить класс, используемый в качестве типа для передаваемого параметра, как реализующий интерфейс Remote
 
 (3) определить класс, используемый в качестве типа для передаваемого параметра, как наследующий от UnicastRemoteObject
 
Номер 2
При вызове метода addNewCard
, экземпляр Card
передается на сервер как:
Ответ:
 (1) копия объекта, после передачи данных сервером, объекты могут быть независимо изменены на клиенте и сервере 
 (2) ссылка на объект, после изменения которой на сервере, меняется объект на клиенте 
 (3) сам объект непосредственно. После передачи он перестает существовать на клиенте и доступен только на сервере 
Номер 3
Какие из следующих утверждений являются верными:
Ответ:
 (1) в качестве типа аргумента для метода, могущего быть вызванным удаленно посредством Java RMI
, могут выступать только классы, содержащие поля и не содержащие методы 
 (2) в качестве типа аргумента для метода, могущего быть вызванным удаленно посредством Java RMI
, могут выступать только классы, помеченные как реализующие интерфейс Serializable
 
 (3) в качестве типа аргумента для метода, могущего быть вызванным удаленно посредством Java RMI
, могут выступать только классы, конструктор которых не имеет передаваемых в него аргументов 
Упражнение 5:
Номер 1
В какой строке кода BillingServiceImpl
происходит чтение из сети аргументов, передаваемых в метод processOperations
:
1 // BillingServiceImpl.java
2 // BillingServiceImpl реализует удаленный интерфейс BillingService для
3 // предоставления удаленного объекта BillingService
4 package com.asw.rmi.ex2;
5
6 // Набор базовых пакетов Java
7 import java.rmi.*;
8 import java.util.*;
9 import java.rmi.server.*;
10
11 public class BillingServiceImpl extends UnicastRemoteObject
12 implements BillingService {
13
14 private Hashtable hash; // хэш-таблица для хранения карт
15 // инициализация сервера
16 public BillingServiceImpl() throws RemoteException{
17 super();
18 hash = new Hashtable();
19 }
20
21 // реализация метода addNewCard интерфейса BillingService
22 public void addNewCard(Card card) throws RemoteException {
23
24 hash.put(card.cardNumber, card);
25 }
26
27 // реализация метода processOperations интерфейса BillingService
28 public void processOperations(CardOperation[] operations)
29 throws RemoteException {
30 for (int i=0;i<operations.length;i++){
31 Card c = (Card)hash.get(operations[i].card);
32 if (c==null) throw new NotExistsCardOperation();
33 c.balance+=operations[i].amount;
34 hash.put(operations[i].card,c);
35 }
36 }
37
38 // реализация метода getCard интерфейса BillingService
39 public Card getCard(String card) throws RemoteException{
40 Card c = (Card)hash.get(card);
41 return c;
42 };
43
44 // запуск удаленного объекта BillingService
45 public static void main (String[] args) throws Exception {
46 System.out.println("Initializing BillingService...");
47
48 // создание удаленного объекта
49 BillingService service = new BillingServiceImpl();
50
51 //задание имени удаленного объекта
52 String serviceName = "rmi://localhost/BillingService";
53 // регистрация удаленного объекта BillingService в реестре rmiregistry
54 Naming.rebind(serviceName, service);
55 }
56
57 }
Ответ:
 (1) 31 
 (2) 33 
 (3) в коде класса BillingServiceImpl
нет операторов, осуществляющих чтение передаваемых клиентом аргументов из сети 
Номер 2
Почему в коде BillingServiceImpl
отсутствуют операторы чтения данных из сети?
Ответ:
 (1) чтение из сети осуществляется в коде классов, расположенных выше по иерархии наследования 
 (2) класс BillingServiceImpl
должен быть дополнен операторами чтения из сети 
 (3) чтение осуществляется в строке 31 
Номер 3
Возвращаемым значением для метода, вызываемого удаленно, могут быть:
Ответ:
 (1) значения системных типов данных 
 (2) значение любого пользовательского типа данных, в том случае, если этот тип - сериализуем 
 (3) значение любого пользовательского типа данных, без ограничения на возможность его сериализации 
Упражнение 6:
Номер 1
В строке 18, в классе BillingClient
:
1 // BillingClient.java
2 // BillingClient использует удаленный объект BillingService для работы
3 // с информацией на пластиковых картах
4 package com.asw.rmi.ex2;
5
6 // Набор базовых пакетов Java
7 import java.rmi.*;
8 import java.util.Date;
9
10 public class BillingClient {
11 // выполнение BillingClient
12 public static void main(String[] args) throws Exception{
13 // создание строки, содержащей URL удаленного объекта
14 String objectName = "rmi://"+args[0]+"/BillingService";
15 System.out.println("Starting...\n");
16 // соединение с реестром RMI и получение удаленной ссылки
17 // на удаленный объект
18 BillingService bs = (BillingService)Naming.lookup(objectName);
19 System.out.println("done");
20
21 // проверка на наличие карт с указанными номерами
22 // в случае отсутствия карты с указанными параметрами
23 // добавляем новую карту
24 Card c;
25 c = bs.getCard("1");
26 if (c==null) {
27 c = new Card("Piter",new Date(),"1",0.0);
28 bs.addNewCard(c);
29 }
30
31 c = bs.getCard("2");
32 if (c==null) {
33 c = new Card("Stefan",new Date(),"2",0.0);
34 bs.addNewCard(c);
35 }
36
37 c = bs.getCard("3");
38 if (c==null) {
39 c = new Card("Nataly",new Date(),"3",0.0);
40 bs.addNewCard(c);
41 }
42
43 // определение массива операций по картам
44 System.err.println("begin...\n");
45 int cnt = 30000;
46 CardOperation[] co = new CardOperation[cnt];
47 for (int i = 0; i < cnt; i++) {
48 switch (i%3){
49 case 0: co[i] = new CardOperation("1",1,new Date());break;
50 case 1: co[i] = new CardOperation("2",1,new Date());break;
51 case 2: co[i] = new CardOperation("3",1,new Date());break;
52 }
53 }
54 // проведение указанных в массиве операций
55 bs.processOperations(co);
56
57 // печать текущего баланса обработанных карт
58 System.out.println(bs.getCard("1"));
59 System.out.println(bs.getCard("2"));
60 System.out.println(bs.getCard("3"));
61 }
62 }
Ответ:
 (1) создается ссылка на удаленный объект 
 (2) создается экземпляр удаленного объекта на сервере 
 (3) создается экземпляр удаленного объекта в локальном адресном пространстве клиента 
Номер 2
Для запуска системы из клиента и сервера (BillingServiceImpl
и BillingClient
), необходим запуск:
Ответ:
 (1) rmiregistry
, интерпретатора Java
с запущенным BillingServiceImpl
, интерпретатора Java
с запущенным BillingClient
 
 (2) интерпретатора Java
с запущенным BillingServiceImpl
, интерпретатора Java
с запущенным BillingClient
, запуск rmiregistry
обязательным не является 
 (3) rmiregistry
, интерпретатора Java
с запущенным BillingClient
. Запуск BillingServiceImpl
произойдет автоматически при первом запросе клиента 
Номер 3
В строке 54, в классе BillingServiceImpl
:
1 // BillingServiceImpl.java
2 // BillingServiceImpl реализует удаленный интерфейс BillingService для
3 // предоставления удаленного объекта BillingService
4 package com.asw.rmi.ex2;
5
6 // Набор базовых пакетов Java
7 import java.rmi.*;
8 import java.util.*;
9 import java.rmi.server.*;
10
11 public class BillingServiceImpl extends UnicastRemoteObject
12 implements BillingService {
13
14 private Hashtable hash; // хэш-таблица для хранения карт
15 // инициализация сервера
16 public BillingServiceImpl() throws RemoteException{
17 super();
18 hash = new Hashtable();
19 }
20
21 // реализация метода addNewCard интерфейса BillingService
22 public void addNewCard(Card card) throws RemoteException {
23
24 hash.put(card.cardNumber, card);
25 }
26
27 // реализация метода processOperations интерфейса BillingService
28 public void processOperations(CardOperation[] operations)
29 throws RemoteException {
30 for (int i=0;i<operations.length;i++){
31 Card c = (Card)hash.get(operations[i].card);
32 if (c==null) throw new NotExistsCardOperation();
33 c.balance+=operations[i].amount;
34 hash.put(operations[i].card,c);
35 }
36 }
37
38 // реализация метода getCard интерфейса BillingService
39 public Card getCard(String card) throws RemoteException{
40 Card c = (Card)hash.get(card);
41 return c;
42 };
43
44 // запуск удаленного объекта BillingService
45 public static void main (String[] args) throws Exception {
46 System.out.println("Initializing BillingService...");
47
48 // создание удаленного объекта
49 BillingService service = new BillingServiceImpl();
50
51 //задание имени удаленного объекта
52 String serviceName = "rmi://localhost/BillingService";
53 // регистрация удаленного объекта BillingService в реестре rmiregistry
54 Naming.rebind(serviceName, service);
55 }
56
57 }
Ответ:
 (1) производится связывание имени сервиса с экземпляром объекта, реализующим сервис 
 (2) создается экземпляр объекта, который может принимать удаленные вызовы 
 (3) производится останов сервиса