Главная /
Интернет-технологии /
Построение распределенных систем на Java
Построение распределенных систем на Java - ответы на тесты Интуит
Правильные ответы выделены зелёным цветом.
Все ответы: В этом курсе рассказывается о проблемах, cопровождающих разработку распределенных программных систем, и методах решения этих проблем. Все рассмотренные элементы технологии проиллюстрированы примерами, ознакомившись с которыми, читатели получат полное представление о методах разработки распределенных приложений на платформе J2EE.
Все ответы: В этом курсе рассказывается о проблемах, cопровождающих разработку распределенных программных систем, и методах решения этих проблем. Все рассмотренные элементы технологии проиллюстрированы примерами, ознакомившись с которыми, читатели получат полное представление о методах разработки распределенных приложений на платформе J2EE.
Смотрите также:
В качестве транспортного протокола для передачи сообщений
SOAP
может использоваться:
(1) только
HTTP
(2) только
SMTP
(3) только
HTTP
или FTP
(4) любой протокол, с помощью которого можно передавать
XML
-сообщения Какие из следующих утверждений являются верными:
(1) использование
JMS
возможно только совместно с Sun Application Server
(2) использование
JMS
возможно совместно с любым JMS
-провайдером, совместимым со спецификацией
(3) использование
JMS
возможно с любой службой очередей, причем никаких дополнительных интерфейсов и шлюзов - не требуется Информационные системы, выполненные в архитектуре "клиент-сервер"
(1) всегда являются приложениями, работающими с базой данных, требуют наличия в своем составе сервера СУБД
(2) в настоящее время используются редко, только в специальных областях
(3) широко используются, имеют самый разнообразный функционал
Какие из следующих утверждений являются верными:
(1)
UDP
является надежным протоколом передачи данных, обеспечивающим повторную передачу пакета в случае его потери
(2) каждый пакет данных, отправляемый с помощью реализации
UDP
в java.net
должен в явном виде содержать в себе адрес узла-получателя
(3)
UDP
использует понятие сетевого адреса, чтобы идентифицировать узлы получателя и отправителя, но не использует понятие порта, для идентификации принимающего процесса В каком методе класса 1 package com.asw.net.ex1;
2 import java.net.*;
3 import java.util.Hashtable;
4 import java.io.*;
5
6 public class BillingService extends Thread{
7 public static final int ADD_NEW_CARD = 1;
8 public static final int ADD_MONEY = 2;
9 public static final int SUB_MONEY = 3;
10 public static final int GET_CARD_BALANCE = 4;
11 public static final int EXIT_CLIENT = 5;
12
13 private int serverPort = 7896;
14 private ServerSocket ss;
15 private Hashtable hash;
16
17 public static void main(String[] args) {
18 BillingService bs = new BillingService();
19 bs.start();
20 }
21
22 public BillingService(){
23 hash = new Hashtable();
24 }
25
26 public void run(){
27 try {
28 ss = new ServerSocket(serverPort);
29 System.out.println("Server started");
30 while(true){
31 Socket s = ss.accept();
32 System.out.println("Client accepted");
33 BillingClientService bcs = new BillingClientService(this, new DataInputStream(s.getInputStream()),
new DataOutputStream(s.getOutputStream()));
34 bcs.start();
35 }
36 } catch (IOException e) {
37 e.printStackTrace();
38 }
39 }
40
41 public void addNewCard(String personName, String card) {
42 hash.put(card, new Double(0.0));
43 }
44 public void addMoney(String card, double money) {
45 Double d = (Double)hash.get(card);
46 if (d!=null) hash.put(card,new Double(d.doubleValue()+money));
47 }
48 public void subMoney(String card, double money) {
49 Double d = (Double)hash.get(card);
50 if (d!=null) hash.put(card,new Double(d.doubleValue()-money));
51 }
52 public double getCardBalance(String card) {
53 Double d = (Double)hash.get(card);
54 if (d!=null) return d.doubleValue();
55 return 0;
56 }
57 }
BillingService
происходит создание соединений с клиентами:
(1) методе main
(2) в конструкторе
(3) в методе run
Какие из следующих утверждений являются верными:
(1)
Java RMI
может быть использована только в том случае, если все взаимодействующие компоненты системы разработаны с использованием Java
(2)
Java RMI
является универсальной технологией, она не накладывает никаких ограничений на технологии разработки взаимодействующих компонентов
(3)
Java RMI
может использоваться только в том случае, если взаимодействующие компоненты выполняются на узлах с одинаковой аппаратной платформой Какие из следующих утверждений являются верными:
(1) технология
CORBA
могут быть использованы только в том случае, если компоненты распределенной системы написаны на Java
(2) технология
CORBA
не накладывают ограничения на язык программирования, используемый для разработки компонентов распределенной системы, однако требуется, чтобы он был объектно-ориентированный
(3) технология
CORBA
не накладывают ограничения на язык программирования, используемый для разработки компонентов распределенной системы, не требуется также, чтобы он был объектно-ориентированный Module BillingServiceModule
(в определении BillingService.idl
) при использовании утилиты idlj
породит следующую синтаксическую конструкцию Java
:
(1)
package BillingServiceModule
(2)
interface BillingServiceModule
(3)
class BillingServiceModule
При использовании
Dynamic Invocation Interface (DII)
на стороне клиента, использование IDL
для автоматического построения классов на стороне сервера:
(1) не допускается
(2) является обязательным
(3) допускается, но не является обязательным
Метод, предназначенный для публикации и удаленного вызова, помечается аннотацией:
(1)
@WebService()
(2)
@WebMethod()
(3)
@PublishedMethod()
(4)
@WebServiceMethod ()
Какие из следующих утверждений являются верными:
(1) JMS не поддерживает синхронную модель передачи сообщений - все сообщения передаются асинхронно
(2) JMS не поддерживает асинхронную модель передачи сообщений - все сообщения передаются синхронно
(3) JMS поддерживает как синхронную так и асинхронную модели передачи сообщений
Модель сервиса
(1) может применяться для балансировки нагрузки между несколькими серверами
(2) часто используется в ситуации, когда каждый запрос клиента не зависит от предыдущих запросов и нет необходимости в организации клиентской сессии
(3) может использоваться в качестве средства повышения надежности системы в целом
(4) обладает исключительными преимуществами перед остальными возможными моделями построения распределенного приложения
Класс
DatagramSocket
из пакета java.net
:
(1) является классом, экземпляр которого создается только на сервере. При создании требует указать
IP
-адрес клиента
(2) является классом, экземпляр которого создается и на клиенте и на сервере, при создании требует указать: на сервере -
IP
-адрес клиента, на клиенте - IP
-адрес сервера
(3) является классом, экземпляр которого создается и на клиенте и на сервере, при создании может быть указан порт
В какой строке происходит прием соединения клиента (класс 1 package com.asw.net.ex1;
2 import java.net.*;
3 import java.util.Hashtable;
4 import java.io.*;
5
6 public class BillingService extends Thread{
7 public static final int ADD_NEW_CARD = 1;
8 public static final int ADD_MONEY = 2;
9 public static final int SUB_MONEY = 3;
10 public static final int GET_CARD_BALANCE = 4;
11 public static final int EXIT_CLIENT = 5;
12
13 private int serverPort = 7896;
14 private ServerSocket ss;
15 private Hashtable hash;
16
17 public static void main(String[] args) {
18 BillingService bs = new BillingService();
19 bs.start();
20 }
21
22 public BillingService(){
23 hash = new Hashtable();
24 }
25
26 public void run(){
27 try {
28 ss = new ServerSocket(serverPort);
29 System.out.println("Server started");
30 while(true){
31 Socket s = ss.accept();
32 System.out.println("Client accepted");
33 BillingClientService bcs = new BillingClientService(this, new DataInputStream(s.getInputStream()),
new DataOutputStream(s.getOutputStream()));
34 bcs.start();
35 }
36 } catch (IOException e) {
37 e.printStackTrace();
38 }
39 }
40
41 public void addNewCard(String personName, String card) {
42 hash.put(card, new Double(0.0));
43 }
44 public void addMoney(String card, double money) {
45 Double d = (Double)hash.get(card);
46 if (d!=null) hash.put(card,new Double(d.doubleValue()+money));
47 }
48 public void subMoney(String card, double money) {
49 Double d = (Double)hash.get(card);
50 if (d!=null) hash.put(card,new Double(d.doubleValue()-money));
51 }
52 public double getCardBalance(String card) {
53 Double d = (Double)hash.get(card);
54 if (d!=null) return d.doubleValue();
55 return 0;
56 }
57 }
BillingService
):
(1) 31
(2) 19
(3) 34
Класс, методы экземпляра которого могут вызываться удаленно через
Java RMI
должен:
(1) реализовывать интерфейс, который наследует от интерфейса
java.rmi.Remote
(2) реализовывать интерфейс
Serializable
(3) наследовать от класса
Thread
IDL
это:
(1) инструментальное средство, преобразующее байт-код
Java
к виду, который позволяет использовать CORBA
для вызова удаленных методов
(2) специальный язык, который позволяет описывать интерфейсы компонентов, взаимодействующих посредством механизмов
CORBA
(3) сервис именования
CORBA
, разрешающий имя сервиса в объектную ссылку Класс, использующий
Dynamic Invocation Interface (DII)
должен наследовать от:
(1) класса
DynamicImplementation
(2) класса
DynamicInvocation
(3) нет никаких ограничений - класс может наследовать от любого класса, или не наследовать ни от одного класса
Утилита
wsgen
требует для своей работы:
(1) скомпилированный класс, в котором определен
Web
-сервис
(2) исходный код класса, в котором определен
Web
-сервис
(3) исходный код класса, в котором определен
Web
-сервис а также WSDL
описание Web
-сервиса Аннотация @
Resource(mappedName="jms/ConnectionFactory")
:
(1) создает в сервисе очередей новый объект
ConnectionFactory
и помещает ссылку на него в JNDI
(2) извлекает ресурс с
JNDI
-именем jms/ConnectionFactory
и связывает его с переменной, к которой относится аннотация
(3) создает в сервисе очередей новую очередь сообщений с именем
jms/ConnectionFactory
Какие из следующих утверждений являются верными:
(1) модель подключения через
proxy
используется только для организации доступа пользователей в сеть Internet
из локальной сети, других применений этой модели не существует
(2) единственной причиной применения
proxy
является отсутствие канала передачи данных необходимой пропускной способности между клиентами и серверами распределенной системы
(3) применение
proxy
всегда оправданно, поскольку снижает нагрузку на сервера системы, за счет того, что при повторном запросе клиента ему всегда могут быть предоставлены данные, имеющиеся в кэше proxy
Класс
DatagramPacket
из пакета java.net
:
(1) является классом, экземпляры которого используются только на сервере
(2) является классом, экземпляры которого используются и на клиенте и на сервере, при создании и последующей отправке требует указать
IP
-адрес и порт получателя пакета
(3) конструктор класса требует указания
IP
-адреса и порта получателя пакета Класс
BillingClientService
унаследован от класса Thread
, потому что:
(1) все классы, работающие с пакетом
java.net
должны быть унаследованы от класса Thread
(2) класс представляет собой цикл чтения данных от клиента и их обработки, для того чтобы была возможность одновременно обрабатывать данные от нескольких клиентов, класс унаследован от
Thread
(3) класс работает с потоками ввода/вывода (
DataInputStream
, DataOutputStream
), поэтому должен быть унаследован от Thread
Класс
BillingServiceImpl
:
(1) реализовывает методы, определенные в удаленном интерфейсе
BillingService
(2) является классом, методы экземпляра которого могут быть вызваны удаленно, посредством
Java RMI
(3) наследует от класса
UnicastRemoteObject
, что позволяет передавать экземпляры BillingServiceImpl
по сети, используя механизм сериализации В классе
BillingServiceImpl
для удаленного вызова доступны следующие методы:
(1) конструктор
(2)
addNewCard
(3)
getCardBalance
Какие из следующих утверждений являются верными:
(1) класс
CardImpl
реализует операции, определенные для интерфейса Card
в в определении BillingService.idl
(2) класс
CardImpl
наследует от класса CardPOA
- класса, автоматически созданного утилитой idlj
(3) экземпляры класса
CardImpl
непосредственно могут быть использованы в качестве возвращаемых аргументов методов, возвращающих объектную ссылку Какие из следующих утверждений являются верными:
(1) класс, использующий
DSI
, может в процессе работы изменить количество и сигнатуры методов, удаленные вызовы которых он может обрабатывать
(2) класс, использующий
DSI
, может в процессе работы добавить новые методы, удаленные вызовы которых он может обрабатывать, но не может уменьшить их количество или изменить сигнатуры существующих
(3) класс, использующий
DSI
, не может в процессе работы добавить новые или удалить методы, удаленные вызовы которых он может обрабатывать, но может изменить сигнатуры существующих При использовании
Sun Java System Application Server
и набора скриптов из пакета The Java Web Services Tutorial
инсталляция Web
-сервиса осуществляется командой:
(1)
asant deploy
(2)
asant install service
(3)
asant start
Какие из следующих утверждений являются верными:
(1) для использования сообщений типа
ObjectMessage
, необходимо чтобы передаваемые данные были сериализуемых типов
(2) для использования сообщений типа
ObjectMessage
, необходимо чтобы в классах, объекты которых передаются, все поля были объявлены как public
(3) для использования сообщений типа
ObjectMessage
, необходимо чтобы в классах, объекты которых передаются, не содержалось объявлений методов (только полей) Какие из следующих утверждений являются верными:
(1) использование мобильных агентов возможно только в том случае, если они написаны на языке программирования
Java
(2) использование мобильных агентов позволяет переложить часть вычислительной нагрузки с сервера на клиента
(3) использование мобильных агентов потенциально способно привести к проблемам с безопасностью, поскольку предполагает выполнение полученного от сервера кода
Класс
ServerSocket
из пакета java.net
:
(1) в каждый момент времени может существовать только один экземпляр этого класса
(2) при создании требует указать
IP
-адрес клиента, с которым должно быть установлено соединение
(3) создается на клиенте и служит для установки связи с сервером
При передаче экземпляров
CardOperation
по сети, передаются:
(1) копии объектов, после передачи данных они могут быть независимо изменены на клиенте и сервере
(2) ссылка на объект, после изменения которой на сервере, меняется объект на клиенте
(3) сам объект непосредственно. После передачи он перестает существовать на клиенте и доступен только на сервере
В какой строке кода 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 }
BillingServiceImpl
происходит чтение из сети аргументов, передаваемых в метод processOperations
:
(1) 31
(2) 33
(3) в коде класса
BillingServiceImpl
нет операторов, осуществляющих чтение передаваемых клиентом аргументов из сети Для запуска системы из клиента и сервера (
BillingServiceServer
и BillingClient
), необходим запуск:
(1)
tnameserv
, интерпретатора Java
с запущенным BillingServiceServer
, интерпретатора Java
с запущенным BillingClient
(2) интерпретатора
Java
с запущенным BillingServiceImpl
, интерпретатора Java
с запущенным BillingClient
, запуск tnameserv
обязательным не является
(3)
tnameserv
, интерпретатора Java
с запущенным BillingClient
. Запуск BillingServiceImpl
произойдет автоматически при первом запросе клиента Какие из следующих утверждений являются верными:
(1) при использовании
DII
, клиент на этапе формирования удаленного вызова должен обладать информацией о сигнатуре вызываемого удаленного метода
(2) при использовании
DII
не существует способа передать в качестве параметра удаленного метода объектную ссылку
(3) при компиляции класса, использующего
DII
, не используются классы, автоматически сгенерированные утилитой idlj
Какие из следующих утверждений являются верными:
(1)
Sun Java System Application Server
предоставляет возможность выполнения в своей среде Web
-сервисов
(2)
Sun Java System Application Server
позволяет протестировать установленные в нем Web
-сервисы, формируя специальные динамические страницы, позволяющие задать параметры для вызываемых методов Web
-сервиса
(3)
Sun Java System Application Server
предоставляет автоматически создает приложения для тестирования производительности установленных в нем Web
-сервисов В каком порядке должен осуществляться запуск примера с
BillingClient
и BillingService
:
(1) перед запуском
BillingClient
должен быть запущен Sun Application Server
(либо любой другой JMS
-провайдер), сначала запускается BillingClient
, затем BillingService
(2) перед запуском
BillingService
должен быть запущен Sun Application Server
(либо любой другой JMS
-провайдер), сначала запускается BillingService
, затем BillingClient
(3) сначала запускается
BillingClient
, затем, Sun Application Server
и под его управлением - BillingService
Какие из следующих утверждений являются верными:
(1) тонкие клиенты - экзотическая технология, редко применяемая на практике
(2) единственная область применения тонкого клиента - клиентские устройства с недостаточной вычислительной мощностью
(3) тонкие клиенты могут быть использованы в том случае, если мощность клиентских устройств недостаточна. Также использование архитектуры тонких клиентов может упростить процедуры развертывания и поддержки приложения
Класс
Socket
из пакета java.net
:
(1) является представлением одного из концов соединения типа "точка-точка". Предоставляет методы, позволяющие представить сетевой обмен в виде операций ввода/вывода в соответствующие потоки
(2) используется как на стороне клиента, так и на стороне сервера
(3) один экземпляр класса может быть использован для установки соединения с одним удаленным узлом
Какие из следующих утверждений являются верными:
(1) для того чтобы передать несколько объектов одного типа по сети, можно создать из этих объектов массив и передать его
(2) все объекты, передаваемые по сети с помощью механизме сериализации, должны принадлежать классам, реализующим интерфейс
Serializable
(3) класс, реализующий интерфейс
Serializable
, обязан реализовать метод saveObject
этого интерфейса В строке 18, в классе 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 }
BillingClient
:
(1) создается ссылка на удаленный объект
(2) создается экземпляр удаленного объекта на сервере
(3) создается экземпляр удаленного объекта в локальном адресном пространстве клиента
Класс
BillingServiceServer
:
(1) создает экземпляр класса
BillingServiceImpl
, принимающего удаленные вызовы, и регистрирует его в сервисе имен
(2) является классом, экземпляр которого принимает удаленные вызовы
(3) принимает удаленные вызовы от клиента и перенаправляет их
BillingServiceImpl
Как
BillingServiceClient
находит сервис имен:
(1) опрашивает сеть с помощью широковещательных пакетов, ждет ответа от сервиса имен
(2) сетевой адрес узла, на котором запущен сервис имен и его порт указывается в командной строке при вызове клиента
(3)
BillingServiceClient
не использует сервис имен При запуске приложения, использующего
DII
:
(1) нет никаких особенностей
(2) необходимо предварительно запустить сервис
diiserv
(3) необходимо использовать специализированную версию сервиса имен (если сервис имен необходим) -
tnameservx
Аннотация
@WebServiceRef
в классе HelloClient
относится к:
(1) классу в целом
(2) переменной
service
(3) методу
main
Какие из следующих утверждений являются верными:
(1) единственная область применения
P2P
- решение сложных вычислительных задач
(2) в системе, выполненной в архитектуре
P2P
, всегда есть центральный узел, сбой которого приводит к отказу функционирования всей системы в целом
(3) реализация приложения в архитектуре
P2P
, как правило, сложнее, чем с использованием других архитектур за счет того, что разработчику приходится решать задачи, которые при использовании других архитектур просто не возникают Какие из следующих утверждений являются верными:
(1) при использовании
CORBA
, для вызова метода удаленного объекта, клиент должен явно указать сетевой адрес узла, на котором выполняется удаленный объект
(2) имея объектную ссылку (полученную каким-либо образом), клиент для вызова метода удаленного объекта обязан иметь действующее подключение к сервису именования
(3) объектная ссылка для зарегистрированного в сервисе именования объекта может быть получена по имени объекта, указанному при его регистрации
helloservice.endpoint.Hello
представляет собой:
(1) интерфейс, содержащий все методы
Web
-сервиса которые могут быть вызваны. Построен автоматически, утилитой wsimport
(2) класс, представляющий собой клиентский прокси для
Web
-сервиса. Построен автоматически, утилитой wsimport
(3) сервисный класс, предназначен для упаковки/распаковки передаваемых по сети сообщений
Какие из следующих утверждений являются верными:
(1) в настоящее время существует большое количество информационных систем, которые являются распределенными
(2) распределенные системы занимают узкоспециальную нишу, в настоящее время используются редко, только в специальных областях
(3) все вновь создаваемые системы будут распределенными, необходимость в создании и поддержке монолитных систем отпала окончательно
Какие из следующих утверждений являются верными:
(1) использование
IDL
- единственный способ определить интерфейс объекта, объект, не имеющий IDL
-описания, физически не может быть зарегистрирован в сервисе имен
(2) использование
IDL
- единственный способ создать клиента для вызова методов удаленного объекта,
(3) использование
IDL
для определения интерфейсов и создания как серверов, так и клиентов, обязательным не является Утилита
wsimport
для своей работы требует:
(1) адрес
WSDL
-файла, содержащего описание Web
-сервиса
(2) скомпилированный класс, представляющий собой реализацию
Web
-сервиса
(3) исходный код класса, представляющего собой реализацию
Web
-сервиса Какие из перечисленных примеров являются примерами распределенных систем:
(1) текстовый редактор
notepad
(2) отдельный браузер
Internet Explorer
(3) система, включающая в себя браузер и веб-сервер
(4) несколько текстовых редакторов
notepad
, расположенных на нескольких компьютерах Для определения интерфейса удаленного объекта, в
IDL
используется ключевое слово:
(1)
interface
(2)
module
,
(3)
object
Сколько методов, доступных для удаленного вызова, содержит
Web
-сервис Billing
:
(1) 3
(2) 4
(3) 5
Какие из следующих утверждений являются верными:
(1) масштабируемость - свойство, которым распределенная система обладает по определению
(2) распределенная система считается безопасной, если все передаваемые по сети данные - шифруются
(3) распределенная система в большинстве случаев будет системой, в которой присутствует параллельное выполнение потоков - либо на разных узлах, либо на одном
API
динамических вызовов используется:
(1) клиентами, для вызова удаленных методов, чьи сигнатуры не известны на момент компиляции
(2) серверами, для динамического определения интерфейса (набора методов, которые могут удаленно вызываться клиентами),
(3) серверами, для вызова удаленных методов других серверов
Какие из следующих утверждений являются верными:
(1) транспортные классы
Card
и CardOperation
, используются как на стороне клиента, так и на стороне Web
-сервиса
(2) на стороне клиента используются классы
Card
и CardOperation
, сгенерированные утилитой wsimport
из WSDL
-описания, на стороне Web
-сервиса - классы Card
и CardOperation
, написанные разработчиком
(3) на стороне клиента используются классы
Card
и CardOperation
, сгенерированные утилитой wsimport
из WSDL
-описания, на стороне Web
-сервиса - классы Card
и CardOperation
, сгенерированные утилитой wsgen
Какие из следующих утверждений являются верными:
(1) перед использованием аннотации вида
@Resource(mappedName="jms/Queue")
, соответствующий объект Queue
должен быть создан
(2) аннотация вида
@Resource(mappedName="jms/Queue")
относится к классу, реализующему прием сообщений из очереди с именем jms/Queue
(3) аннотация вида
@Resource(mappedName="jms/Queue")
должна относиться к переменной типа Queue
Какие из следующих утверждений являются верными:
(1) если в распределенном приложении начало сеанса взаимодействия между клиентом и сервером инициируется сервером, такое приложение является неправильно спроектированным и требует перепроектирования
(2) модель, при которой соединение инициирует сервер, часто используется в случае, если клиенты имеют необходимость обработки событий, поступающих из внешнего источника
(3) модель, при которой соединение инициирует сервер, часто используется в случае, если клиенты имеют необходимость обработки событий, поступающих из внешнего источника. При этом если источниками событий являются сами клиенты, то использовать данную модель категорически не рекомендуется
Протокол
TCP
:
(1) не является надежным протоколом передачи данных. Пакеты
TCP
могут теряться, либо приходить в неправильном порядке. Прикладной программист должен учитывать эти особенности
(2)
TCP
использует понятие сетевого адреса, чтобы идентифицировать узлы получателя и отправителя и понятие порта, для идентификации принимающего процесса
(3) является ориентированным на соединение. Соединение является соединением типа "точка-точка" и позволяет передавать данные между двумя узлами
Протокол обмена данными между клиентом и сервером, предложенный в первой части лекции обладает следующими недостатками:
(1) ошибка в передаче одной команды может привести к неправильной интерпретации всех последующих команд
(2) для того чтобы добавить новую команду, необходимо изменять схему наследования классов системы
(3) протокол требует, чтобы и клиент и сервер были запущены на одном узле
Для того чтобы методы, определенные в удаленном интерфейсе могли принимать параметры типа "класс, определенный пользователем", необходимо:
(1) определить класс, используемый в качестве типа для передаваемого параметра, как реализующий интерфейс
Serializable
(2) определить класс, используемый в качестве типа для передаваемого параметра, как реализующий интерфейс
Remote
(3) определить класс, используемый в качестве типа для передаваемого параметра, как наследующий от
UnicastRemoteObject
Почему в коде 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 }
BillingServiceImpl
отсутствуют операторы чтения данных из сети?
(1) чтение из сети осуществляется в коде класса
BillingServicePOA
, сформированного автоматически утилитой idlj
(2) класс
BillingServiceImpl
должен быть дополнен операторами чтения из сети
(3) чтение осуществляется в строке 17
Класс
BillingServiceServer
, это:
(1) реализация интерфейса
BillingService
, определенного в BillingService.idl
(2) класс, создающий объект, реализующий интерфейс
BillingService
, и регистрирующий его в сервисе имен
(3) серверный скелетон, использующийся для приема параметров от клиента и передачи их серверному классу
Какие из следующих утверждений являются верными:
(1) в сервисе имен в каждый момент времени только один зарегистрированный объект может использовать
DSI
(2) метод
invoke
(унаследованный от класса DynamicImplementation
) не может быть объявлен как synchronized
(3) при компиляции класса, использующего
DSI
, не используются классы, автоматически сгенерированные утилитой idlj
SOAP
это:
(1) один из сервисов, входящих в инфраструктуру
Web
-сервисов
(2) протокол, позволяющий осуществлять вызов методов удаленных объектов
(3) способ описания интерфейса удаленного объекта
Какие из следующих утверждений являются верными:
(1) при использовании
JMS
взаимодействие между компонентами может быть асинхронным
(2) при использовании
JMS
компонент может оправить сообщение, которое получат несколько получателей
(3) при использовании
JMS
компонент не может отправить сообщение самому себе Модель "клиент-сервер"
(1) часто используется для приложений, работающих с базами данных
(2) является единственно-возможной, для построения распределенного приложения
(3) обладает исключительными преимуществами перед остальными возможными моделями построения распределенного приложения
(4) является безусловно устаревшей, ее ни в коем случае не следует выбирать в качестве модели, при разработке распределенного приложения
Какие из следующих утверждений являются верными:
(1) для функционирования
UDP
необходимо, чтобы каждый узел сети имел уникальный сетевой адрес
(2) порт в
UDP
используется для идентификатора процесса - получателя пакета
(3)
UDP
не является надежным протоколом передачи данных. Пакеты UDP
могут теряться Класс
BillingService
унаследован от класса Thread
, потому что:
(1) любой класс, использующий пакет
java.net
должен быть унаследован от Thread
(2) в методе main запускается несколько экземпляров
BillingService
, которые должны работать параллельно
(3) по условиям задачи сервер должен уметь обрабатывать сообщения, поступающие от нескольких клиентов одновременно
Java RMI
может быть использована только в том случае, если:
(1) все взаимодействующие компоненты распределенной системы выполнены на
Java
(2) между компонентами системы передаются данные только системных, встроенных типов, передача с помощью
Java RMI
пользовательских типов данных невозможна
(3) все компоненты системы расположены на одном узле
CORBA
это:
(1) коммерческий продукт, разрабатываемый компанией
Sun
(2) часть технологии
Java
, которая может быть использована для создания распределенных систем, выполненных исключительно с использованием технологии Java
(3) стандарт, определяющий различные аспекты взаимодействия компонентов распределенных систем и общие сервисы, существует множество реализаций этого стандарта
Описание
Card getCard(in string card)
в определении BillingService.idl
означает, что метод getCard
возвращает:
(1) объектную ссылку
(2) экземпляр класса
Card
, созданный на сервере и переданный на клиента посредством механизма сериализации
(3) экземпляр класса
Card
, созданный на клиенте При использовании
Dynamic Dynamic Skeleton Interface (DSI)
на стороне сервера, использование IDL
для автоматического построения классов на стороне клиента:
(1) не допускается
(2) является обязательным
(3) допускается, но не является обязательным
Класс, который должен быть опубликован в качестве
Web
-сервиса должен быть помечен аннотацией:
(1)
@Service()
(2)
@WebService()
(3)
@PublicWebService()
Какие из следующих утверждений являются верными:
(1) при использовании модели взаимодействия типа "точка-точка" каждое сообщение может быть получено только один раз
(2) при использовании модели взаимодействия типа "точка-точка" к очереди сообщений могут последовательно получить доступ несколько клиентов
(3) при использовании модели взаимодействия типа "точка-точка" клиент явно опрашивает состояние очереди
Какое из следующих утверждений является верными:
(1) модель сервиса обладает безусловными преимуществами перед моделью "клиент-сервер", все приложения, выполненные в архитектуре "клиент-сервер", безусловно должны быть переделаны с использованием модели сервиса
(2) переход от архитектуры "клиент-сервер" к архитектуре сервиса всегда может быть выполнен автоматически, без переработки исходной системы, при этом автоматически будут получены эффекты балансировки нагрузки и повышения надежности
(3) область применения модели сервиса чрезвычайно узка, в настоящий момент практически нет приложений, выполненных в этой модели
Класс
DatagramSocket
из пакета java.net
:
(1) при создании требует указать
IP
-адрес клиента, позволяет передавать пакеты только клиенту, чей IP
-адрес был указан при его создании
(2) является классом, экземпляр которого создается и на клиенте и на сервере, при создании требует указать номер порта
(3) является классом, экземпляр которого создается и на клиенте и на сервере, в случае, если при создании не был указан порт - он выбирается автоматически
После выполнения какой строки сервер (класс 1 package com.asw.net.ex1;
2 import java.net.*;
3 import java.util.Hashtable;
4 import java.io.*;
5
6 public class BillingService extends Thread{
7 public static final int ADD_NEW_CARD = 1;
8 public static final int ADD_MONEY = 2;
9 public static final int SUB_MONEY = 3;
10 public static final int GET_CARD_BALANCE = 4;
11 public static final int EXIT_CLIENT = 5;
12
13 private int serverPort = 7896;
14 private ServerSocket ss;
15 private Hashtable hash;
16
17 public static void main(String[] args) {
18 BillingService bs = new BillingService();
19 bs.start();
20 }
21
22 public BillingService(){
23 hash = new Hashtable();
24 }
25
26 public void run(){
27 try {
28 ss = new ServerSocket(serverPort);
29 System.out.println("Server started");
30 while(true){
31 Socket s = ss.accept();
32 System.out.println("Client accepted");
33 BillingClientService bcs = new BillingClientService(this, new DataInputStream(s.getInputStream()), new DataOutputStream(s.getOutputStream()));
34 bcs.start();
35 }
36 } catch (IOException e) {
37 e.printStackTrace();
38 }
39 }
40
41 public void addNewCard(String personName, String card) {
42 hash.put(card, new Double(0.0));
43 }
44 public void addMoney(String card, double money) {
45 Double d = (Double)hash.get(card);
46 if (d!=null) hash.put(card,new Double(d.doubleValue()+money));
47 }
48 public void subMoney(String card, double money) {
49 Double d = (Double)hash.get(card);
50 if (d!=null) hash.put(card,new Double(d.doubleValue()-money));
51 }
52 public double getCardBalance(String card) {
53 Double d = (Double)hash.get(card);
54 if (d!=null) return d.doubleValue();
55 return 0;
56 }
57 }
BillingService
) может принимать соединения клиентов:
(1) 18
(2) 23
(3) 28
Определение удаленного интерфейса
RMIExample
должно выглядеть следующим образом:
(1)
public interface RMIExample extends Remote
(2)
public interface RMIExample implements Remote
(3)
public interface RMIExample extends RMI.
Файл, с
IDL
-описанием может содержать:
(1) описание интерфейсов компонентов
(2) описание реализации компонентов
(3) описание типов данных
Класс, использующий
Dynamic Dynamic Skeleton Interface (DSI)
должен наследовать от:
(1) класса
DynamicImplementation
(2) класса
DynamicSkeleton
(3) нет никаких ограничений - класс может наследовать от любого класса, или не наследовать ни от одного класса
Результатом работы утилиты
wsgen
является:
(1) пакет
jaxws
, содержащий вспомогательные классы, в том числе - транспортные
(2)
WSDL
-описание сервиса
(3) инсталляция сервиса в сервере приложений
Какие из следующих утверждений являются верными:
(1) перед использованием аннотации вида
@Resource(mappedName="jms/ConnectionFactory")
, соответствующий объект ConnectionFactory
должен быть создан
(2) аннотация вида
@Resource(mappedName="jms/ConnectionFactory")
относится к классу, реализующему прием сообщений из очереди с именем jms/ConnectionFactory
(3) аннотация вида
@Resource(mappedName="jms/ConnectionFactory")
должна относиться к переменной типа ConnectionFactory
Использование
proxy
:
(1) в некоторых случаях может привести к уменьшению нагрузки на сервера системы
(2) всегда приводит к уменьшению количества передаваемых данных между клиентом и сервером
(3) в некоторых случаях приводит к увеличению общей производительности системы
Класс
DatagramPacket
из пакета java.net
:
(1) при создании может быть указать
IP
-адрес и порт получателя
(2) при создании требуется указать
IP
-адрес и порт получателя
(3) при создании и последующей пересылке может быть указан только
IP
-адрес получателя, его порт в этом случае будет определен автоматически Чтение из потока, в строке 21, в случае, если клиент после установки соединения не записал в поток никаких данных, приведет:
1 package com.asw.net.ex1;
2 import java.io.*;
3
4 public class BillingClientService extends Thread {
5 DataInputStream dis;
6 DataOutputStream dos;
7 BillingService bs;
8
9 public BillingClientService (BillingService bs,DataInputStream dis,DataOutputStream dos){
10 this.bs = bs;
11 this.dis = dis;
12 this.dos = dos;
13 }
14
15 public void run(){
16 System.out.println("ClientService thread started");
17 boolean work = true;
18 while (work) {
19 int command;
20 try {
21 command = dis.readInt();
22 switch (command) {
23 case BillingService.ADD_NEW_CARD:
24 addNewCard();
25 break;
26 case BillingService.ADD_MONEY:
27 addMoney();
28 break;
29 case BillingService.SUB_MONEY:
30 subMoney();
31 break;
32 case BillingService.GET_CARD_BALANCE:
33 getCardBalance();
34 break;
35 case BillingService.EXIT_CLIENT:
36 work = false;
37 break;
38 default:
39 System.out.println("Bad operation:" + command);
40 }
41 } catch (IOException e) {
42 e.printStackTrace();
43 }
44 }
45 }
46
47 void addNewCard() throws IOException{
48 String personName = dis.readUTF();
49 String card = dis.readUTF();
50 bs.addNewCard(personName,card);
51 }
52 void addMoney() throws IOException{
53 String card = dis.readUTF();
54 double money = dis.readDouble();
55 bs.addMoney(card,money);
56 }
57 void subMoney() throws IOException{
58 String card = dis.readUTF();
59 double money = dis.readDouble();
60 bs.subMoney(card,money);
61 }
62 void getCardBalance() throws IOException{
63 String card = dis.readUTF();
64 double money = bs.getCardBalance(card);
65 dos.writeDouble(money);
66 }
67 }
(1) к ошибке, на момент вызова метода
readInt
(строка 21) данные должны быть уже переданы со стороны клиента
(2) метод будет заблокирован до момента поступления данных со стороны клиента или обрыва соединения
(3) метод возвратит 0
В классе
BillingServiceImpl
для удаленного вызова посредством Java RMI
доступны следующие методы:
(1) конструктор
(2)
addNewCard
(3)
getCardBalance
Утилита
idlj
:
(1) формирует описание удаленного интерфейса из исходного кода класса
(2) автоматически формирует на основании файла описания
idl
вспомогательные классы, которые затем используются как на стороне клиента, так и на стороне сервера
(3) требует для своей работы исходного кода для класса, реализующего удаленный интерфейс
Какие из следующих утверждений являются верными:
(1) если предполагается возврат объектных ссылок
Card
, класс CardImpl
должен реализовывать интерфейс Serializable
(2) в классе
CardImpl
нельзя объявлять synchronized
методы
(3) класс
CardImpl
должен реализовывать все методы, определенные для интерфейса Card
Класс, использующий
Dynamic Dynamic Skeleton Interface (DSI),
в методе invoke
:
(1) регистрирует в сервисе имен сигнатуры методов, которые для данного класса могут быть вызваны удаленно
(2) принимает и обрабатывает запрос клиента, содержащий имя вызываемого метода и передаваемые аргументы
(3) вызывает удаленные методы сервера
WSDL
-файл представляет собой:
(1)
XML
-документ
(2)
HTTP
-запрос
(3) бинарный файл, полученный путем сериализации класса, реализующего
Web
-сервис
(1) 22
(2) 23
(3) 24
Модель, при которой сервер инициирует соединение:
(1) часто используется в ситуации, когда основной задачей клиентов является реакция на сообщения, посылаемые другими клиентами системы
(2) часто используется в ситуации, когда клиент и сервер связаны каналом передачи данных недостаточной пропускной способности
(3) используется для того, чтобы снизить нагрузку на сервер
Какие из следующих утверждений являются верными:
(1)
TCP
является надежным протоколом передачи данных, обеспечивающим повторную передачу пакета в случае его потери
(2) с точки зрения прикладного программиста, реализация протокола
TCP
, предлагаемая java.net
, организует передачу данных в виде пакетов данных, разбиение на которые и контроль за прохождением которых программист осуществляет самостоятельно
(3)
TCP
использует понятие сетевого адреса, чтобы идентифицировать узлы получателя и отправителя, но не использует понятие порта, для идентификации принимающего процесса Для того чтобы указать системе на то, что экземпляры класса могут быть сохранены в поток/прочитаны из потока, необходимо:
(1) объявить публичный класс, указав что он наследует от
InputStream
(2) объявить публичный класс, указав, что он реализует интерфейс
Serializable
(3) объявить публичный класс, указав что он наследует от
OutputStream
При вызове метода
addNewCard
, экземпляр Card
передается на сервер как:
(1) копия объекта, после передачи данных сервером, объекты могут быть независимо изменены на клиенте и сервере
(2) ссылка на объект, после изменения которой на сервере, меняется объект на клиенте
(3) сам объект непосредственно. После передачи он перестает существовать на клиенте и доступен только на сервере
В какой строке кода 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 }
BillingServiceImpl
происходит чтение из сети аргументов, передаваемых в метод addNewCard
:
(1) 17
(2) 21
(3) в коде класса
BillingServiceImpl
нет операторов, осуществляющих чтение передаваемых клиентом аргументов из сети В какой строке класса
BillingServiceServer
(листинг программы) создается объект, реализующий интерфейс BillingService
, определенный в BillingService.idl
:
(1) 14
(2) 24
(3) 26
При регистрации в сервисе имен класса, использующего
DSI
:
(1) нет никаких особенностей
(2) нужно следить за тем, чтобы в сервисе имен не оказались одновременно два класса, использующих
DSI
(3) необходимо использовать специализированное
API
регистрации При использовании
Sun Java System Application Server
и набора скриптов из пакета The Java Web Services Tutorial
подготовка модуля развертывания Web
-сервиса:
(1)
asant deploy
(2)
asant create-war
(3)
asant start
В какой строчке кода осуществляется чтение сообщения клиента:
(1) 49
(2) 52
(3) 53
(4) в этом классе чтение сообщений не осуществляется
Мобильные агенты:
(1) выполняются на сервере, результаты своей работы передают на клиента
(2) их код получается с сервера и выполняется на клиенте, результат их работы, как правило, остается на клиенте
(3) могут использоваться для снижения нагрузки на сервер
(4) часто используются в том случае, если клиент обладает всеми необходимыми данными и вычислительной мощностью для решения своей задачи, однако не обладает алгоритмом для ее решения
Класс
ServerSocket
из пакета java.net
:
(1) при создании не устанавливает никаких соединений, соединения устанавливаются позднее, при получении входящего соединения от клиента
(2) при создании устанавливает соединение с клиентом.
IP
-адрес клиента передается в конструкторе
(3) один экземпляр класса может быть использован для установки соединения с одним клиентом
При передаче объектов, с использованием
ObjectOutputStream
/ObjectInputStream
:
(1) после создания потока по нему можно передавать только объекты одного класса, в случае, если необходимо передавать объекты нескольких классов, необходимо создавать несколько экземпляров потоков ввода/вывода
(2) после создания потока ввода/вывода по нему можно передавать объекты разных классов
(3) после создания потока ввода/вывода по нему можно передавать объекты разных классов, однако объекты одного класса должны быть явно отделены от объектов другого класса специальным разделителем
Почему в коде
BillingServiceImpl
отсутствуют операторы чтения данных из сети?
(1) чтение из сети осуществляется в коде классов, расположенных выше по иерархии наследования
(2) класс
BillingServiceImpl
должен быть дополнен операторами чтения из сети
(3) чтение осуществляется в строке 31
В строке 41, в классе 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 }
BillingServiceServer
:
(1) производится связывание имени сервиса с экземпляром объекта, реализующим сервис
(2) создается экземпляр объекта, который может принимать удаленные вызовы
(3) производится останов сервиса
Для запуска примера потребуются следующие утилиты (при использовании реализации
CORBA
, включенной в пакет JDK
):
(1) только интерпретатор
java
(2) интерпретатор
java
, tnameserv
, servertool
(3) интерпретатор
java
, orbd
, servertool
При регистрации в сервисе имен класса, использующего
DII
:
(1) нет никаких особенностей
(2) нужно следить за тем, чтобы в сервисе имен не оказались одновременно два класса, использующих
DII
(3) необходимо использовать специализированное
API
регистрации При использовании возможности тестирования
Web
-сервиса, предоставляемой Sun Java System Application Server
пользователь имеет возможность:
(1) вызвать метод сервиса, передав ему параметры
(2) после выполнения метода - получить результат, им возвращенный
(3) в случае, если метод выполнился с ошибкой - отладить метод, задав для него точки останова, просматриваемые переменные и т.д.
Какие утилиты, входящие в состав
JDK
, используются при компиляции BillingClient
и BillingService
:
(1) только
javac
(2)
javac
и wsimport
(3)
javac
и jmsgen
Тонкие клиенты:
(1) часто используются на мобильных устройствах и других устройствах с недостаточной вычислительной мощностью
(2) могут использоваться и на устройствах с достаточной вычислительной мощностью, делая более удобным развертывание и сопровождение приложения
(3) позволяют экономить средства, развертывая рабочие места на устаревших компьютерах
Класс
Socket
из пакета java.net
:
(1) в каждый момент времени может существовать только один экземпляр этого класса
(2) в конструктор может быть передан
IP
-адрес и порт узла, с которым должно быть установлено соединение
(3) экземпляр этого класса никогда не создается, класс имеет статические методы для установки соединения с клиентом
Какие из следующих утверждений являются верными:
(1) механизм сериализации использует снимки памяти, поэтому не может быть использован для переноса объектов между узлами разной аппаратной архитектуры
(2) механизм сериализации позволяет сохранить состояние метода объекта в процессе его работы таким образом, что после восстановления, метод продолжит свою работу с того момента, на котором он был остановлен
(3) механизм сериализации сохраняет лишь значение полей объекта, но не сохраняет состояния его методов в процессе их выполнения
Для запуска системы из клиента и сервера (
BillingServiceImpl
и BillingClient
), необходим запуск:
(1)
rmiregistry
, интерпретатора Java
с запущенным BillingServiceImpl
, интерпретатора Java
с запущенным BillingClient
(2) интерпретатора
Java
с запущенным BillingServiceImpl
, интерпретатора Java
с запущенным BillingClient
, запуск rmiregistry
обязательным не является
(3)
rmiregistry
, интерпретатора Java
с запущенным BillingClient
. Запуск BillingServiceImpl
произойдет автоматически при первом запросе клиента В строке 32 , в классе 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 }
BillingServiceServer
:
(1) производится получение объектной ссылки на корневой раздел имен
(2) производится получение объектной ссылки на объект, реализующий сервис
BillingService
(3) производится создание корневого раздела имен
Класс
BillingServiceServer
запускается на исполнение:
(1) непосредственно пользователем, с помощью интерпретатор
java
(2) автоматически сервисом
orbd
, класс доден быть предварительно в сервисе зарегистрирован
(3) непосредственно пользователем, с помощью интерпретатор
java
, однако предварительно класс должен быть зарегистрирован с помощью утилиты servertool
При запуске приложения, использующего
DSI
:
(1) нет никаких особенностей
(2) необходимо предварительно запустить сервис
dsiserv
(3) необходимо использовать специализированную версию сервиса имен (если сервис имен необходим) -
tnameservx
Как клиент
HelloClient
получает сетевой адрес и имя Web
-сервиса, метод которого необходимо вызвать:
(1) эти параметры указываются в командной строке при запуске клиента
(2) эти параметры извлекаются из
WSDL
-файла, указанного в качестве параметра для аннотации @WebServiceRef
(3) для вызова метода
Web
-сервиса клиенту не нужно знать сетевой адрес и имя Web
-сервиса Какие из следующих утверждений являются верными:
(1)
P2P
- экзотическая технология, редко применяемая на практике
(2)
P2P
- наиболее часто используемая в настоящее время архитектура создания распределенных систем. Все современные бизнес-приложения выполнены с использованием этой архитектуры
(3)
P2P
- самая простая из имеющихся в настоящее время архитектур распределенных приложений. Создание распределенной системы с использованием этой архитектуры занимает гораздо меньше времени, чем при использовании какой-либо другой Какие из следующих утверждений являются верными:
(1) не существует возможности зарегистрировать один и тот же объект в сервисе именований под разными именами
(2) раз зарегистрированный под определенным именем в сервисе именований объект, не может быть заменен на другой объект (под этим же именем)
(3) раз зарегистрированный под определенным именем в сервисе именований объект не может быть из него удален
helloservice.endpoint.HelloService
представляет собой:
(1) интерфейс, содержащий все методы
Web
-сервиса которые могут быть вызваны. Построен автоматически, утилитой wsimport
(2) класс, представляющий собой клиентский прокси для
Web
-сервиса. Построен автоматически, утилитой wsimport
(3) сервисный транспортный класс, предназначен для сериализации и последующей передачи по сети. Построен автоматически, утилитой
wsimport
Разрабатываемая вами информационная система распределенная, если:
(1) при разработке используются технологии
Java
или .Net
(2) команда, которая разрабатывает систему, территориально распределена по нескольким городам
(3) планируется, что разрабатываемая система должна быть мультиплатформенной
(4) использование разрабатываемой системы предполагает функционирование ее компонентов на различных узлах
Какие из следующих утверждений являются верными:
(1) не существует возможности зарегистрировать один и тот же объект в сервисе именований под разными именами
(2) раз зарегистрированный под определенным именем в сервисе именований объект, не может быть заменен на другой объект (под этим же именем)
(3) раз зарегистрированный под определенным именем в сервисе именований объект не может быть из него удален
Результатом работы утилиты
wsimport
является:
(1) набор классов, представляющих собой реализацию
Web
-сервиса
(2) набор классов, облегчающих разработку клиентского приложения для доступа к
Web
-сервису
(3) класс, являющийся клиентским приложением для
Web
-сервиса Какие из перечисленных примеров не являются примерами распределенных систем:
(1) инструментальная среда программирования
Eclipse
(2) несколько инструментальных сред программирования, расположенных на разных компьютерах
(3) несколько инструментальных сред программирования, расположенных на разных компьютерах, взаимодействующих с системой контроля версий
Роль "серверной заглушки" автоматически создаваемой утилитой
idlj
состоит в:
(1) приемке и распаковке параметров, переданных объектным брокером, вызов соответствующих методов целевого объекта, передача результатов обратно объектному брокеру
(2) регистрации удаленного объекта в сервисе именования
(3) обеспечении компиляции серверного класса, до того момента, пока заглушка не будет заменена разработчиком на полнофункциональный модуль
Транспортный класс
Card
в обязательном порядке должен:
(1) быть объявлен как
implements Serializable
(2) быть помечен аннотацией
@WebClass
(3) быть помечен аннотацией
@WebService
Какие из следующих утверждений являются верными:
(1) одним из мотивов создания гетерогенных распределенных систем является то, что разные (по комплектации, вычислительной мощности и т.д.) узлы лучше решают разные задачи. Можно развертывать компоненты системы на тех узлах, которые наиболее приспособлены для их выполнения
(2) сложность разработки гетерогенной системы можно снизить за счет использования одной из существующих технологий "промежуточного слоя" (
middleware
)
(3) единственный способ написать гетерогенное распределенной приложение - написать его на
Java
Динамические скелетоны используются:
(1) клиентами, для вызова удаленных методов, чьи сигнатуры не известны на момент компиляции
(2) серверами, для динамического определения интерфейса (набора методов, которые могут удаленно вызываться клиентами),
(3) серверами, для вызова удаленных методов других серверов
Классы
Card
и CardOperation
на стороне клиента:
(1) ничем не отличаются от классов на стороне сервера, содержат все методы, определенные разработчиком для этих классов
(2) автоматически сгенерированы утилитой
wsimport
, содержат только методы установки и чтения значений полей, не содержат никаких других методов, определенных разработчиком для этих классов на стороне сервера
(3) автоматически сгенерированы утилитой
wsimport
, содержат как методы установки и чтения значений полей, так и методы, определенные разработчиком для этих классов на стороне сервера WSDL
это:
(1) описание
Web
-сервиса, содержащее описание всех методов, которые Web
-сервис может исполнять
(2) протокол, позволяющий осуществлять вызов методов удаленных объектов
(3) формат сообщения, передаваемого между компонентами системы
Какие из следующих утверждений являются верными:
(1) при использовании
JMS
отправитель и получатель сообщения на момент отправки сообщения должны быть оба запущены
(2) использование
JMS
подразумевает существование посредника (сервиса очередей) между отправителем и получателем сообщений
(3) отправка сообщений при использовании
JMS
осуществляется в асинхронном режиме Какие из следующих утверждений являются верными:
(1) архитектура "клиент-сервер" является лучшей архитектурой, для создания распределенной системы
(2) архитектура "клиент-сервер" является одной из возможных моделей построения распределенных систем, обладает как достоинствами, так и недостатками, что позволяет рекомендовать выбирать эту архитектуру в качестве базовой, для распределенных систем определенных классов
(3) архитектура "клиент-сервер" на текущий момент является морально-устаревшей и не должна выбираться в качестве модели при построении распределенных систем
Использование
UDP
может быть оправданно в том случае, если:
(1) прикладной протокол самостоятельно отслеживает потерю пакетов
(2) прикладной протокол не является ориентированным на соединение
(3) сеть, в которой функционирует приложение, имеет сложную структуру, с множеством территориально разнесенных сегментов, объединенных маршрутизаторами. Коммуникации сильно нагружены потоками данных
Класс 1 package com.asw.net.ex1;
2 import java.net.*;
3 import java.util.Hashtable;
4 import java.io.*;
5
6 public class BillingService extends Thread{
7 public static final int ADD_NEW_CARD = 1;
8 public static final int ADD_MONEY = 2;
9 public static final int SUB_MONEY = 3;
10 public static final int GET_CARD_BALANCE = 4;
11 public static final int EXIT_CLIENT = 5;
12
13 private int serverPort = 7896;
14 private ServerSocket ss;
15 private Hashtable hash;
16
17 public static void main(String[] args) {
18 BillingService bs = new BillingService();
19 bs.start();
20 }
21
22 public BillingService(){
23 hash = new Hashtable();
24 }
25
26 public void run(){
27 try {
28 ss = new ServerSocket(serverPort);
29 System.out.println("Server started");
30 while(true){
31 Socket s = ss.accept();
32 System.out.println("Client accepted");
33 BillingClientService bcs = new BillingClientService(this, new DataInputStream(s.getInputStream()),
new DataOutputStream(s.getOutputStream()));
34 bcs.start();
35 }
36 } catch (IOException e) {
37 e.printStackTrace();
38 }
39 }
40
41 public void addNewCard(String personName, String card) {
42 hash.put(card, new Double(0.0));
43 }
44 public void addMoney(String card, double money) {
45 Double d = (Double)hash.get(card);
46 if (d!=null) hash.put(card,new Double(d.doubleValue()+money));
47 }
48 public void subMoney(String card, double money) {
49 Double d = (Double)hash.get(card);
50 if (d!=null) hash.put(card,new Double(d.doubleValue()-money));
51 }
52 public double getCardBalance(String card) {
53 Double d = (Double)hash.get(card);
54 if (d!=null) return d.doubleValue();
55 return 0;
56 }
57 }
BillingService
производит непосредственное чтение данных, передаваемых клиентом в методе:
(1) run
(2) конструкторе
(3) класс не содержит методов, осуществляющих непосредственное чтение данных, передаваемых клиентом
Какие из следующих утверждений являются верными:
(1)
Java RMI
при передаче в качестве параметров пользовательских объектов, для их передачи по сети использует механизм сериализации Java
(2)
Java RMI
не может быть напрямую использована в том случае, если необходимо связать компоненты, выполненные не на Java
(3) для того, чтобы программа на
Java
стала программой, использующей Java RMI
, ее необходимо откомпилировать с особым ключом компиляции. Никаких дополнительных действий - не требуется CORBA
может быть использована при разработке:
(1) только таких распределенных систем, все компоненты которых написаны на
Java
(2) только в том случае, если взаимодействующие компоненты выполняются на узлах с одинаковой аппаратной платформой
(3) только в том случае, если вызываемые удаленно методы принимают параметры только простых, системных типов данных
Описание
Card addNewCard(in string personName, in string card)
в определении BillingService.idl
означает, что объектная ссылка Card
, возвращаемая методом, "указывает" на:
(1) объект, созданный на сервере (в адресном пространстве сервера)
(2) объект, созданный на клиенте (в адресном пространстве клиента)
(3) объект, являющийся разделом сервиса имен, в котором зарегистрирован объект
Card
Dynamic Invocation Interface (DII)
и Dynamic Dynamic Skeleton Interface (DSI)
используются:
(1)
DII
- на стороне, осуществляющей вызов удаленного метода (клиенте)
(2)
DSI
- на стороне, осуществляющей вызов удаленного метода (клиенте)
(3)
DSI
- на стороне, осуществляющей реализацию удаленного метода (сервере)
(4)
DII
- на стороне, осуществляющей реализацию удаленного метода (сервере) Какие аннотации из пакета
javax.jws
минимально необходимы при "автоматическом" создании Web
-сервиса, содержащего хотя бы один метод:
(1)
@Service()
и @ServiceMethod()
(2)
@WebService()
, @WebMethod()
и @Parameter
(3)
@WebService()
и @WebMethod()
Какие из следующих утверждений являются верными:
(1) при использовании модели взаимодействия типа издание-подписка сообщение, прочитанное одним клиентом, автоматически удаляется из очереди и не может быть прочитано другими клиентами
(2) при использовании модели взаимодействия типа издание-подписка клиенты уведомляются о том, что в очереди есть сообщение на тему, на которую они подписаны
(3) при использовании модели взаимодействия типа издание-подписка клиенты могут устанавливать долговременные подписки, позволяющие отсоединиться и позже снова подключиться и получать сообщения, поступившие во время отключения связи
Какие из следующих утверждений являются верными:
(1) модель сервиса является лучшей из всех возможных моделей построения распределенной системы, однако чрезвычайно сложна в реализации, поэтому в настоящий момент практически нет примеров распределенных систем, построенных с ее использованием
(2) одна из самых больших сложностей при построении распределенных систем с использованием модели сервиса - обеспечение целостности и непротиворечивости данных, при их одновременной обработке несколькими серверами, образующими сервис
(3) модель сервиса часто используется при построении распределенных систем с высокими требованиями к надежности и производительности
Класс
DatagramSocket
из пакета java.net
:
(1) может быть создан только один экземпляр данного класса за время жизни приложения
(2) создает "точку связи" с одним клиентом (при создании требуется указать его
IP
-адрес), после создания может отправлять пакеты только ему
(3) после создания может быть использован для пересылки пакетов нескольким клиентам последовательно
Класс
BillingService
допускает одновременное подключение и передачу данных для какого числа клиентов:
(1) 1, одновременная передача данных несколькими клиентами не допускается
(2) 2
(3) нескольких, точное число зависит от системных настроек и количества свободных ресурсов узла
Какие из следующих утверждений являются верными:
(1) в удаленном интерфейсе, наследующим от
java.rmi.Remote
, определяются те методы объекта, которые могут быть вызваны удаленно
(2) в удаленном интерфейсе, наследующим от
java.rmi.Remote
, должны быть определены все методы объекта, как те, которые могут быть вызваны удаленно, так и остальные
(3) в удаленном интерфейсе, наследующим от
java.rmi.Remote
, не должно быть определено ни одного метода. Те методы, которые могут быть вызваны удаленно, объект самостоятельно регистрирует в системе, после своего создания Объектная ссылка в
CORBA
это:
(1) указатель на объект в локальной памяти клиента
(2) указатель на объект в локальной памяти сервера
(3) специальный описатель, который позволяет брокеру запросов установить местонахождение удаленного объекта и выполнить вызов его метода
В хэштаблице
_cards
(класс BillingServiceImpl
) хранятся:
(1) экземпляры класса
CardImpl
(2) экземпляры класса
Card
(3) экземпляры класса
_CardStub
При использовании
Dynamic Invocation Interface (DII)
и Dynamic Dynamic Skeleton Interface (DSI)
на классы накладываются следующие ограничения по наследованию:
(1) класс, использующий
DII
должен наследовать от класса DynamicInvocation
, класс, использующий DSI
должен наследовать от класса DynamicSkeleton
(2) класс, использующий
DII
должен наследовать от класса DynamicImplementation
, на класс, использующий DSI
никаких ограничений по наследованию - не накладывается
(3) на класс, использующий
DII
никаких ограничений по наследованию - не накладывается, класс, использующий DSI
должен наследовать от класса DynamicImplementation
(4) никаких ограничений по наследованию в обоих случаях - не накладывается
WSDL
-описание сервиса при использовании сервера приложений Sun Java System Application Server
:
(1) должно быть сформировано разработчиком вручную
(2) генерируется автоматически утилитой
wsgen
(3) генерируется автоматически при инсталляции сервиса в сервере приложений
Аннотация
@Resource(mappedName="jms/Queue")
:
(1) создает в сервисе очередей новый объект
Queue
и помещает ссылку на него в JNDI
(2) извлекает ресурс с
JNDI
-именем jms/Queue
и связывает его с переменной, к которой относится аннотация
(3) устанавливает соединение с очередью с именем
jms/Queue
Какие из следующих утверждений являются верными:
(1) использование
proxy
снижает общую производительность системы
(2) использование
proxy
всегда приводит к увеличению количества передаваемых данных между компонентами системы
(3) за счет использования
proxy
может быть обеспечена балансировка нагрузки между серверами Класс
DatagramPacket
из пакета java.net
:
(1) может быть создан только один экземпляр данного класса за время жизни приложения
(2) в каждый момент времени может существовать только один экземпляр данного класса
(3) создает "точку связи" с одним клиентом (при создании требуется указать его
IP
-адрес), после создания может отправлять пакеты только ему
(4) конструктор класса требует указания
IP
-адреса и порта получателя пакета В случае если клиент завершит соединение, не послав предварительно сигнал 1 package com.asw.net.ex1;
2 import java.io.*;
3
4 public class BillingClientService extends Thread {
5 DataInputStream dis;
6 DataOutputStream dos;
7 BillingService bs;
8
9 public BillingClientService (BillingService bs,DataInputStream dis,DataOutputStream dos){
10 this.bs = bs;
11 this.dis = dis;
12 this.dos = dos;
13 }
14
15 public void run(){
16 System.out.println("ClientService thread started");
17 boolean work = true;
18 while (work) {
19 int command;
20 try {
21 command = dis.readInt();
22 switch (command) {
23 case BillingService.ADD_NEW_CARD:
24 addNewCard();
25 break;
26 case BillingService.ADD_MONEY:
27 addMoney();
28 break;
29 case BillingService.SUB_MONEY:
30 subMoney();
31 break;
32 case BillingService.GET_CARD_BALANCE:
33 getCardBalance();
34 break;
35 case BillingService.EXIT_CLIENT:
36 work = false;
37 break;
38 default:
39 System.out.println("Bad operation:" + command);
40 }
41 } catch (IOException e) {
42 e.printStackTrace();
43 }
44 }
45 }
46
47 void addNewCard() throws IOException{
48 String personName = dis.readUTF();
49 String card = dis.readUTF();
50 bs.addNewCard(personName,card);
51 }
52 void addMoney() throws IOException{
53 String card = dis.readUTF();
54 double money = dis.readDouble();
55 bs.addMoney(card,money);
56 }
57 void subMoney() throws IOException{
58 String card = dis.readUTF();
59 double money = dis.readDouble();
60 bs.subMoney(card,money);
61 }
62 void getCardBalance() throws IOException{
63 String card = dis.readUTF();
64 double money = bs.getCardBalance(card);
65 dos.writeDouble(money);
66 }
67 }
EXIT_CLIENT
:
(1) экземпляр
BillingClientService
никогда не завершит свою работу (не выйдет из метода run
)
(2) экземпляр
BillingClientService
завершит свою работу
(3) возникнет системная ошибка, все экземпляры
BillingClientService
завершат свою работу Утилита
rmic
:
(1) формирует описание удаленного интерфейса
(2) требует для своей работы исходного кода для определения удаленного интерфейса
(3) требует для своей работы исходного кода для класса, реализующего удаленный интерфейс
Класс
BillingServiceImpl
:
(1) реализовывает методы, определенные для интерфейса
BillingService
в файле idl
-описания
(2) является классом, методы экземпляра которого могут быть вызваны удаленно
(3) наследует от класса
BillingServicePOA
, который был сформирован автоматически утилитой idlj
из idl
-описания Класс
CardImpl
, это:
(1) реализация интерфейса
Card
, определенного в BillingService.idl
(2) класс, создающий объект, реализующий интерфейс
BillingService
, и регистрирующий его в сервисе имен
(3) клиентская заглушка, использующаяся для приема параметров и отправки их серверному классу
Класс, использующий
Dynamic Dynamic Skeleton Interface (DSI)
, наследуя от класса DynamicImplementation
должен реализовать метод(ы):
(1)
invoke
(2)
read
и write
(3)
serverRequest
В
WSDL
-файле содержится:
(1) сигнатуры методов
Web
-сервиса
(2) реализация методов
Web
-сервиса
(3) описание процедуры сборки и инсталляции
Web
-сервиса Какие типы сообщений поддерживаются в
JMS
:
(1) текстовые сообщения
(2) неинтерпретируемый поток байт
(3) тип сообщений для передачи сериализуемых объектов
Какие из следующих утверждений являются верными:
(1) для функционирования
TCP
необходимо, чтобы каждый узел сети имел уникальный сетевой адрес
(2) порт в
TCP
используется для идентификатора процесса - получателя пакета
(3)
TCP
не является надежным протоколом передачи данных. Пакеты TCP
могут теряться Класс, объявленный как реализующий интерфейс
Serializable
, обязательно должен удовлетворять следующим условиям:
(1) иметь единственный конструктор, не принимающий аргументов
(2) иметь только поля, не иметь методов
(3) иметь только поля системных типов данных. Поля пользовательских типов данных - не допускаются
Какие из следующих утверждений являются верными:
(1) в качестве типа аргумента для метода, могущего быть вызванным удаленно посредством
Java RMI
, могут выступать только классы, содержащие поля и не содержащие методы
(2) в качестве типа аргумента для метода, могущего быть вызванным удаленно посредством
Java RMI
, могут выступать только классы, помеченные как реализующие интерфейс Serializable
(3) в качестве типа аргумента для метода, могущего быть вызванным удаленно посредством
Java RMI
, могут выступать только классы, конструктор которых не имеет передаваемых в него аргументов В какой строке кода 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 }
BillingServiceImpl
осуществляется прием клиентского соединения:
(1) 17
(2) за прием клиентского соединения отвечает брокер, сам класс напрямую клиентское соединение не принимает
(3) класс
BillingServiceImpl
должен быть дополнен операторами приема клиенсткого соединения В какой строке класса
BillingServiceServer
(листинг программы) объект, реализующий интерфейс BillingService
, регистрируется в сервисе имен:
(1) 37
(2) 42
(3) 33
При регистрации в сервисе имен класса, использующего
DII
:
(1) нет никаких особенностей
(2) нужно следить за тем, чтобы в сервисе имен не оказались одновременно два класса, использующих
DII
(3) необходимо использовать специализированное
API
регистрации При использовании
Sun Java System Application Server
и набора скриптов из пакета The Java Web Services Tutorial
вызов утилиты wsgen
должен быть осуществлен:
(1) после вызова
asant create-war
, перед вызовом asant deploy
(2) после вызова
asant build
, перед вызовом asant create-war
(3) перед вызовом
asant build
(4) вызов утилиты
wsgen
осуществляется автоматически при выполнении asant build
, явно вызывать wsgen
- не нужно Использование мобильных агентов оправданно:
(1) если клиент обладает значительной вычислительной мощностью
(2) если все данные, необходимые для решения задачи расположены на клиенте, или клиент может их быстро получить
(3) если структура задачи такова, что алгоритмы обработки данных часто меняются и нецелесообразно при каждом их изменении переустанавливать клиентские приложения
Класс
ServerSocket
из пакета java.net
:
(1) после создания, посредством вызова метода
connect
, устанавливает соединение с клиентом. IP
-адрес клиента передается в метод connect
в качестве параметра
(2) параметр порт может быть передан в конструктор класса
(3) экземпляр этого класса никогда не создается, класс имеет статические методы для установки соединения с клиентом
Метод 1 package com.asw.net.ex2;
2 import java.io.*;
3 import java.net.*;
4
5 public class BillingClientService extends Thread {
6 ObjectInputStream ois;
7 ObjectOutputStream oos;
8 BillingService bs;
9 Socket s;
10
11 public BillingClientService(BillingService bs,Socket s){
12 System.out.println("Constructor BillingClientService\n");
13 this.bs = bs;
14 this.s = s;
15 try {
16 this.oos = new ObjectOutputStream(s.getOutputStream());
17 this.ois = new ObjectInputStream(s.getInputStream());
18 } catch (IOException e) {
19 // TODO Auto-generated catch block
20 e.printStackTrace();
21 }
22
23 System.out.println("Stream`s done \n socket="+s);
24 }
25 public void run(){
26 System.out.println("ClientService thread started\n");
27 boolean work = true;
28 while (work) {
29 int command;
30 Object o;
31 try {
32 o = ois.readObject();
33 if (o instanceof Card[]) {
34 Card[] cards = (Card[])o;
35 for (int i=0;i<cards.length;i++){
36 bs.addNewCard(cards[i]);
37 }
38 }else if (o instanceof CardOperation[]){
39 CardOperation[] co = (CardOperation[])o;
40 for (int i=0;i<co.length;i++){
41 bs.addMoney(co[i].card,co[i].amount);
42 }
43 }else if (o instanceof String){
44 oos.writeObject(bs.getCard((String)o));
45 }else System.out.println("Bad operation");
46
47 } catch (IOException e) {
48 e.printStackTrace();
49 } catch (ClassNotFoundException e) {
50 e.printStackTrace();
51 }
52 }
53 }
54 }
readObject
, в строке 32 , в случае, если клиент после установки соединения не записал в поток никаких данных, приведет:
(1) к ошибке, на момент вызова метода
readObject
(строка 32) данные должны быть уже переданы со стороны клиента
(2) метод будет заблокирован до момента поступления данных со стороны клиента или обрыва соединения
(3) метод возвратит
null
Возвращаемым значением для метода, вызываемого удаленно, могут быть:
(1) значения системных типов данных
(2) значение любого пользовательского типа данных, в том случае, если этот тип - сериализуем
(3) значение любого пользовательского типа данных, без ограничения на возможность его сериализации
Запуск приложения осуществляется в следующем порядке:
(1) запуск сервиса
tnameserv
, запуск утилиты servertool
, запуск клиента, запуск сервера
(2) запуск сервиса
orbd
, регистрация с помощью утилиты servertool
сервера, запуск клиента
(3) запуск утилиты
servertool
, запуск сервиса orbd
, запуск сервера, запуск клиента При регистрации в сервисе имен класса, использующего
DSI
:
(1) нет никаких особенностей
(2) нужно следить за тем, чтобы в сервисе имен не оказались одновременно два класса, использующих
DSI
(3) необходимо использовать специализированное
API
регистрации При использовании возможности тестирования
Web
-сервиса, предоставляемой Sun Java System Application Server
, после вызова метода отображается:
(1) только
SOAP
-пакет, полученный от Web
-сервиса
(2) только
SOAP
-пакет, переданный Web
-сервису
(3) и
SOAP
-пакет, переданный Web
-сервису и SOAP
-пакет, полученный от Web
-сервиса С помощью каких утилит, входящих в состав
Sun Application Server
, осуществляется запуск BillingClient
и BillingService
:
(1) appclient для BillingClient и appserver для BillingService
(2) appclient для BillingClient и BillingService
(3) appclient для BillingClient и deploy для BillingService
Использование тонких клиентов может быть оправданно в том случае, если:
(1) клиент обладает незначительной вычислительной мощностью
(2) канал передачи данных между клиентом и сервером обладает недостаточной пропускной способностью
(3) клиенты работают под управлением различных операционных систем, на различных аппаратных платформах
Класс
Socket
из пакета java.net
:
(1) после создания и установки соединения, может быть использован для передачи данных нескольким узлам
(2) позволяет выполнять однонаправленные обмены от клиента к серверу. Для выполнения двунаправленных обменов необходимо создать два экземпляра класса
(3) используется только на стороне клиента, на сервере используется серверный аналог -
ServerSocket
Какие из следующих утверждений являются верными:
(1) не существует способа указать системе при сериализации объекта, что какие-то его поля не должны сохраняться и затем передаваться
(2) при передаче объекта, всегда полностью передается описание его класса, таким образом для сериализации подходят только "короткие" объекты, не содержащие длинных сложных методов
(3) механизм сериализации сохраняет лишь значение полей объекта, но не сохраняет состояния его методов в процессе их выполнения
В строке 54, в классе 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 }
BillingServiceImpl
:
(1) производится связывание имени сервиса с экземпляром объекта, реализующим сервис
(2) создается экземпляр объекта, который может принимать удаленные вызовы
(3) производится останов сервиса
Создание класс
BillingServiceServer
с параметром при регистрации LifespanPolicyValue.PERSISTENT
обеспечивает:
(1) возможность регистрации класса в
orbd
и автоматическое создание экземпляра класса
(2) автоматическое сохранение состояния класса между запусками
orbd
(3) автоматическое восстановление состояния класса после фатальной ошибки
При использовании
DII
, в случае, если сигнатура удаленного метода изменена, необходимо:
(1) только перекомпилировать клиентское приложение
(2) перезапустить клиентское приложение, без перекомпиляции
(3) переписать ту часть клиентского приложения, которая отвечает за упаковку аргументов для изменившегося метода и перекомпилировать его.
Компиляция класса
HelloClient
должна производиться в следующей последовательности:
(1) запуск компилятора
javac
, затем запуск утилиты wsimport
(2) запуск утилиты
wsimport
, затем запуск компилятора javac
(3) запуск только компилятора
javac
, запуск wsimport
- не нужен
(4) запуск только
wsimport
, запуск компилятора javac
- не нужен Какие из следующих утверждений являются верными:
(1) разработка распределенной системы как правило более сложная задача, чем разработка монолитной системы
(2) разработка распределенных систем настолько сложная задача, что под силу только крупнейшим
IT
-компаниям
(3) распределенная система всегда будет работать быстрее и надежнее монолитной системы
Роль "клиентской заглушки" автоматически создаваемой утилитой
idlj
состоит в:
(1) упаковке получаемых при вызове ее методов аргументов, передаче их серверу, приемке и распаковке результатов
(2) разрешении имени удаленного объекта в объектную ссылку
(3) обеспечении компиляции клиентского класса, до того момента, пока заглушка не будет заменена разработчиком на полнофункциональный модуль
Поля транспортных классов, которые предполагается передавать между компонентами, в обязательном порядке:
(1) должны быть системных типов
(2) должны быть типов, объявленных как
implements Serializable
(3) должны быть помечены аннотацией
@WebParameter
Следующие технологии могут использоваться для создания распределенных приложений:
(1)
Java
(2) .
Net
(3)
MPI
Какие из следующих утверждений являются верными:
(1) API динамических вызовов не может использоваться совместно с API динамических скелетонов
(2) при использовании API динамических вызовов, становится недоступным использование сервиса именования
(3) API динамических вызовов позволяют написать клиентское приложение без использования IDL-описания и утилиты idlj
(1) вызовется метод, определенный в строках 18-20 класса
Card
(2) вызовется метод
toString(),
определенный по умолчанию
(3) вызовется метод
toString(),
созданный утилитой wsimport
в классе Card
Использование
P2P
может быть оправданно в том случае, если:
(1) состав узлов, во время работы системы - изменяется
(2) необходимо обеспечить децентрализацию системы. Отдельные сбои узлов системы не должны приводить к отказу системы в целом
(3) клиенты (узлы) системы обладает незначительной вычислительной мощностью
Сервис именования
CORBA
это:
(1) сервис, обеспечивающий получение объектной ссылки по имени объекта
(2) сервис, генерирующий уникальные имена для объектов по задаваемому пользователем правилу
(3) сервис именования не входит в спецификацию
CORBA
и является расширением, реализуемым компанией Sun
Открытость, применительно к распределенным системам означает:
(1) отсутствие шифрования передаваемых данных
(2) предоставление конечному пользователю исходных кодов системы
(3) использование при разработке системы открытых стандартов и наличие только документирование интерфейсов
При объявлении методов в
IDL
, типы передаваемых в них аргументов должны:
(1) быть системными, создание пользовательских типов данных не допускается
(2) быть либо системными, либо определенными как
struct
- использование в качестве типа передаваемого аргумента ранее определенных интерфейсов - недопустимо
(3) в качестве типов аргументов могут быть использованы как системные типы, так и типы определенные пользователем, в том числе - интерфейсы