Главная /
Построение распределенных систем на Java
Построение распределенных систем на Java - ответы на тесты Интуит
В этом курсе рассказывается о проблемах, cопровождающих разработку распределенных программных систем, и методах решения этих проблем. Все рассмотренные элементы технологии проиллюстрированы примерами, ознакомившись с которыми, читатели получат полное представление о методах разработки распределенных приложений на платформе J2EE.
Список вопросов:
- # В качестве транспортного протокола для передачи сообщений SOAP может использоваться:
- # SOAP это:
- # WSDL это:
- # Метод, предназначенный для публикации и удаленного вызова, помечается аннотацией:
- # Класс, который должен быть опубликован в качестве Web-сервиса должен быть помечен аннотацией:
- # Какие аннотации из пакета javax.jws минимально необходимы при "автоматическом" создании Web-сервиса, содержащего хотя бы один метод:
- # Утилита wsgen требует для своей работы:
- # Результатом работы утилиты wsgen является:
- # WSDL-описание сервиса при использовании сервера приложений Sun Java System Application Server:
- # WSDL-файл представляет собой:
- # В WSDL-файле содержится:
- # При использовании Sun Java System Application Server и набора скриптов из пакета The Java Web Services Tutorial инсталляция Web-сервиса осуществляется командой:
- # При использовании Sun Java System Application Server и набора скриптов из пакета The Java Web Services Tutorial подготовка модуля развертывания Web-сервиса:
- # При использовании Sun Java System Application Server и набора скриптов из пакета The Java Web Services Tutorial вызов утилиты wsgen должен быть осуществлен:
- # Какие из следующих утверждений являются верными:
- # При использовании возможности тестирования Web-сервиса, предоставляемой Sun Java System Application Server пользователь имеет возможность:
- # При использовании возможности тестирования Web-сервиса, предоставляемой Sun Java System Application Server, после вызова метода отображается:
- # Аннотация @WebServiceRef в классе HelloClient относится к:
- # Как клиент HelloClient получает сетевой адрес и имя Web-сервиса, метод которого необходимо вызвать:
- # helloservice.endpoint.Hello представляет собой:
- # helloservice.endpoint.HelloService представляет собой:
- # Компиляция класса HelloClient должна производиться в следующей последовательности:
- # Утилита wsimport для своей работы требует:
- # Результатом работы утилиты wsimport является:
- # Сколько методов, доступных для удаленного вызова, содержит Web-сервис Billing:
- # Транспортный класс Card в обязательном порядке должен:
- # Поля транспортных классов, которые предполагается передавать между компонентами, в обязательном порядке:
- # Какие из следующих утверждений являются верными:
- # Классы Card и CardOperation на стороне клиента:
- # При вызове метода toString() для экземпляра класса Card на стороне клиента (листинг программы):
- # Какие из следующих утверждений являются верными:
- # Какие из следующих утверждений являются верными:
- # Какие из следующих утверждений являются верными:
- # Какие из следующих утверждений являются верными:
- # Какие из следующих утверждений являются верными:
- # Какие из следующих утверждений являются верными:
- # Аннотация @Resource(mappedName="jms/ConnectionFactory"):
- # Какие из следующих утверждений являются верными:
- # Аннотация @Resource(mappedName="jms/Queue"):
- # Какие из следующих утверждений являются верными:
- # Соединение с JMS-провайдером в классе JMSClient осуществляется в строке (листинг программы):
- # Какие типы сообщений поддерживаются в JMS:
- # Какие из следующих утверждений являются верными:
- # В какой строчке кода осуществляется чтение сообщения клиента: 1 package com.asw.jms.ex1; 2 3 import javax.jms.*; 4 import javax.annotation.Resource; 5 import java.io.InputStreamReader; 6 import java.io.IOException; 7 import java.util.Hashtable; 8 import java.util.Enumeration; 9 10 public class BillingService { 11 @Resource(mappedName = "jms/ConnectionFactory") 12 private static ConnectionFactory connectionFactory; 13 @Resource(mappedName = "jms/Queue") 14 private static Queue queue; 15 16 Hashtable hash = new Hashtable(); 17 public void addNewCard(Card c) { 18 hash.put(c.cardNumber, c); 19 }; 20 21 public void performCardOperation(CardOperation co){ 22 Card c = (Card)hash.get(co.card); 23 if (c==null) return; 24 c.balance+=co.amount; 25 hash.put(co.card,c); 26 }; 27 28 public void printCards(){ 29 for(Enumeration e = hash.elements();e.hasMoreElements();) 30 System.out.println(e.nextElement()); 31 } 32 33 public static void main(String[] args) { 34 String destType = null; 35 Connection connection = null; 36 Session session = null; 37 Destination dest = (Destination) queue; 38 MessageConsumer consumer = null; 39 ObjectListener listener = null; 40 TextMessage message = null; 41 InputStreamReader inputStreamReader = null; 42 char answer = '\0'; 43 try { 44 connection = connectionFactory.createConnection(); 45 session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 46 consumer = session.createConsumer(dest); 47 listener = new ObjectListener(new BillingService()); 48 consumer.setMessageListener(listener); 49 connection.start(); 50 System.out.println( 51 "To end program, type Q or q, " + "then <return>"); 52 inputStreamReader = new InputStreamReader(System.in); 53 while (!((answer == 'q') || (answer == 'Q'))) { 54 try { 55 answer = (char) inputStreamReader.read(); 56 } catch (IOException e) { 57 System.err.println("I/O exception: " + e.toString()); 58 } 59 } 60 } catch (JMSException e) { 61 System.err.println("Exception occurred: " + e.toString()); 62 } finally { 63 if (connection != null) { 64 try { 65 connection.close(); 66 } catch (JMSException e) { 67 } 68 } 69 } 70 } 71 }
- # В каком порядке должен осуществляться запуск примера с BillingClient и BillingService:
- # Какие утилиты, входящие в состав JDK, используются при компиляции BillingClient и BillingService:
- # С помощью каких утилит, входящих в состав Sun Application Server, осуществляется запуск BillingClient и BillingService:
- # Информационные системы, выполненные в архитектуре "клиент-сервер"
- # Модель "клиент-сервер"
- # Какие из следующих утверждений являются верными:
- # Модель сервиса
- # Какое из следующих утверждений является верными:
- # Какие из следующих утверждений являются верными:
- # Какие из следующих утверждений являются верными:
- # Использование proxy:
- # Какие из следующих утверждений являются верными:
- # Какие из следующих утверждений являются верными:
- # Модель, при которой сервер инициирует соединение:
- # Какие из следующих утверждений являются верными:
- # Мобильные агенты:
- # Использование мобильных агентов оправданно:
- # Какие из следующих утверждений являются верными:
- # Тонкие клиенты:
- # Использование тонких клиентов может быть оправданно в том случае, если:
- # Какие из следующих утверждений являются верными:
- # Какие из следующих утверждений являются верными:
- # Использование P2P может быть оправданно в том случае, если:
- # Какие из следующих утверждений являются верными:
- # Разрабатываемая вами информационная система распределенная, если:
- # Какие из следующих утверждений являются верными:
- # Какие из перечисленных примеров являются примерами распределенных систем:
- # Какие из перечисленных примеров не являются примерами распределенных систем:
- # Открытость, применительно к распределенным системам означает:
- # Какие из следующих утверждений являются верными:
- # Какие из следующих утверждений являются верными:
- # Следующие технологии могут использоваться для создания распределенных приложений:
- # Какие из следующих утверждений являются верными:
- # Какие из следующих утверждений являются верными:
- # Использование UDP может быть оправданно в том случае, если:
- # Класс DatagramSocket из пакета java.net:
- # Класс DatagramSocket из пакета java.net:
- # Класс DatagramSocket из пакета java.net:
- # Класс DatagramPacket из пакета java.net:
- # Класс DatagramPacket из пакета java.net:
- # Класс DatagramPacket из пакета java.net:
- # Протокол TCP:
- # Какие из следующих утверждений являются верными:
- # Какие из следующих утверждений являются верными:
- # Класс ServerSocket из пакета java.net:
- # Класс ServerSocket из пакета java.net:
- # Класс ServerSocket из пакета java.net:
- # Класс Socket из пакета java.net:
- # Класс Socket из пакета java.net:
- # Класс Socket из пакета java.net:
- # В каком методе класса BillingService происходит создание соединений с клиентами: 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 унаследован от класса Thread, потому что:
- # Класс BillingService производит непосредственное чтение данных, передаваемых клиентом в методе: 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 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 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 допускает одновременное подключение и передачу данных для какого числа клиентов:
- # Класс BillingClientService унаследован от класса Thread, потому что:
- # Чтение из потока, в строке 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 }
- # В случае если клиент завершит соединение, не послав предварительно сигнал EXIT_CLIENT: 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 }
- # Протокол обмена данными между клиентом и сервером, предложенный в первой части лекции обладает следующими недостатками:
- # Для того чтобы указать системе на то, что экземпляры класса могут быть сохранены в поток/прочитаны из потока, необходимо:
- # Класс, объявленный как реализующий интерфейс Serializable, обязательно должен удовлетворять следующим условиям:
- # При передаче экземпляров CardOperation по сети, передаются:
- # При передаче объектов, с использованием ObjectOutputStream/ObjectInputStream:
- # Метод readObject, в строке 32 , в случае, если клиент после установки соединения не записал в поток никаких данных, приведет: 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 }
- # Какие из следующих утверждений являются верными:
- # Какие из следующих утверждений являются верными:
- # Какие из следующих утверждений являются верными:
- # Какие из следующих утверждений являются верными:
- # Java RMI может быть использована только в том случае, если:
- # Какие из следующих утверждений являются верными:
- # Класс, методы экземпляра которого могут вызываться удаленно через Java RMI должен:
- # Определение удаленного интерфейса RMIExample должно выглядеть следующим образом:
- # Какие из следующих утверждений являются верными:
- # Класс BillingServiceImpl:
- # В классе BillingServiceImpl для удаленного вызова посредством Java RMI доступны следующие методы:
- # Утилита rmic:
- # Для того чтобы методы, определенные в удаленном интерфейсе могли принимать параметры типа "класс, определенный пользователем", необходимо:
- # При вызове метода addNewCard, экземпляр Card передается на сервер как:
- # Какие из следующих утверждений являются верными:
- # В какой строке кода 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 }
- # Почему в коде BillingServiceImpl отсутствуют операторы чтения данных из сети?
- # Возвращаемым значением для метода, вызываемого удаленно, могут быть:
- # В строке 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 }
- # Для запуска системы из клиента и сервера (BillingServiceImpl и BillingClient), необходим запуск:
- # В строке 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 }
- # Какие из следующих утверждений являются верными:
- # CORBA это:
- # CORBA может быть использована при разработке:
- # IDL это:
- # Файл, с IDL-описанием может содержать:
- # Объектная ссылка в CORBA это:
- # В классе BillingServiceImpl для удаленного вызова доступны следующие методы:
- # Утилита idlj:
- # Класс BillingServiceImpl:
- # Почему в коде BillingServiceImpl отсутствуют операторы чтения данных из сети? 1 // BillingServiceImpl.java 2 package com.asw.corba.ex1; 3 4 // базовые пакеты Java 5 import java.util.Hashtable; 6 7 import com.asw.corba.ex1.BillingServiceModule.*; 8 9 // пакеты OMG CORBA 10 import org.omg.CORBA.*; 11 12 public class BillingServiceImpl extends BillingServicePOA { 13 private ORB orb; 14 private Hashtable hash = new Hashtable(); 15 16 public void setORB(ORB orb_val) { 17 orb = orb_val; 18 } 19 20 public void addNewCard(String personName, String card) { 21 hash.put(card, new Double(0.0)); 22 } 23 24 public void addMoney(String card, double money) { 25 Double d = (Double)hash.get(card); 26 27 if (d!=null) hash.put(card,new Double(d.doubleValue()+money)); 28 } 29 30 public void subMoney(String card, double money) { 31 Double d = (Double)hash.get(card); 32 33 if (d!=null) hash.put(card,new Double(d.doubleValue()-money)); 34 } 35 36 public double getCardBalance(String card) { 37 Double d = (Double)hash.get(card); 38 39 if (d!=null) return d.doubleValue(); 40 else return 0; 41 } 42 }
- # В какой строке кода BillingServiceImpl происходит чтение из сети аргументов, передаваемых в метод addNewCard: 1 // BillingServiceImpl.java 2 package com.asw.corba.ex1; 3 4 // базовые пакеты Java 5 import java.util.Hashtable; 6 7 import com.asw.corba.ex1.BillingServiceModule.*; 8 9 // пакеты OMG CORBA 10 import org.omg.CORBA.*; 11 12 public class BillingServiceImpl extends BillingServicePOA { 13 private ORB orb; 14 private Hashtable hash = new Hashtable(); 15 16 public void setORB(ORB orb_val) { 17 orb = orb_val; 18 } 19 20 public void addNewCard(String personName, String card) { 21 hash.put(card, new Double(0.0)); 22 } 23 24 public void addMoney(String card, double money) { 25 Double d = (Double)hash.get(card); 26 27 if (d!=null) hash.put(card,new Double(d.doubleValue()+money)); 28 } 29 30 public void subMoney(String card, double money) { 31 Double d = (Double)hash.get(card); 32 33 if (d!=null) hash.put(card,new Double(d.doubleValue()-money)); 34 } 35 36 public double getCardBalance(String card) { 37 Double d = (Double)hash.get(card); 38 39 if (d!=null) return d.doubleValue(); 40 else return 0; 41 } 42 }
- # В какой строке кода BillingServiceImpl осуществляется прием клиентского соединения: 1 // BillingServiceImpl.java 2 package com.asw.corba.ex1; 3 4 // базовые пакеты Java 5 import java.util.Hashtable; 6 7 import com.asw.corba.ex1.BillingServiceModule.*; 8 9 // пакеты OMG CORBA 10 import org.omg.CORBA.*; 11 12 public class BillingServiceImpl extends BillingServicePOA { 13 private ORB orb; 14 private Hashtable hash = new Hashtable(); 15 16 public void setORB(ORB orb_val) { 17 orb = orb_val; 18 } 19 20 public void addNewCard(String personName, String card) { 21 hash.put(card, new Double(0.0)); 22 } 23 24 public void addMoney(String card, double money) { 25 Double d = (Double)hash.get(card); 26 27 if (d!=null) hash.put(card,new Double(d.doubleValue()+money)); 28 } 29 30 public void subMoney(String card, double money) { 31 Double d = (Double)hash.get(card); 32 33 if (d!=null) hash.put(card,new Double(d.doubleValue()-money)); 34 } 35 36 public double getCardBalance(String card) { 37 Double d = (Double)hash.get(card); 38 39 if (d!=null) return d.doubleValue(); 40 else return 0; 41 } 42 }
- # Для запуска системы из клиента и сервера (BillingServiceServer и BillingClient), необходим запуск:
- # В строке 41, в классе BillingServiceServer: 1 // BillingServiceServer.java 2 package com.asw.corba.ex1; 3 4 // пакеты OMG CORBA 5 import org.omg.CosNaming.*; 6 import org.omg.CORBA.*; 7 import org.omg.PortableServer.*; 8 import org.omg.PortableServer.POA; 9 import com.asw.corba.ex1.BillingServiceModule.*; 10 11 public class BillingServiceServer { 12 public static void main(String args[]) { 13 try{ 14 // create and initialize the ORB 15 ORB orb = ORB.init(args, null); 16 17 // get reference to rootpoa & activate the POAManager 18 POA rootpoa = 19 POAHelper.narrow(orb.resolve_initial_references("RootPOA")); 20 rootpoa.the_POAManager().activate(); 21 22 // create servant and register it with the ORB 23 BillingServiceImpl BSImpl = new BillingServiceImpl(); 24 BSImpl.setORB(orb); 25 26 // get object reference from the servant 27 org.omg.CORBA.Object ref = rootpoa.servant_to_reference(BSImpl); 28 BillingService href = BillingServiceHelper.narrow(ref); 29 30 // get the root naming context 31 // NameService invokes the name service 32 org.omg.CORBA.Object objRef = 33 orb.resolve_initial_references("NameService"); 34 // Use NamingContextExt which is part of the Interoperable 35 // Naming Service (INS) specification. 36 NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef); 37 38 // bind the Object Reference in Naming 39 String name = "BillingService"; 40 NameComponent path[] = ncRef.to_name( name ); 41 ncRef.rebind(path, href); 42 43 System.out.println("BillingServiceServer ready and waiting ..."); 44 45 // wait for invocations from clients 46 orb.run(); 47 } 48 49 catch (Exception e) { 50 System.err.println("ERROR: " + e); 51 e.printStackTrace(System.out); 52 } 53 System.out.println("BillingServer Exiting ..."); 54 } 55 }
- # Класс BillingServiceServer:
- # В строке 32 , в классе BillingServiceServer: 1 // BillingServiceServer.java 2 package com.asw.corba.ex1; 3 4 // пакеты OMG CORBA 5 import org.omg.CosNaming.*; 6 import org.omg.CORBA.*; 7 import org.omg.PortableServer.*; 8 import org.omg.PortableServer.POA; 9 import com.asw.corba.ex1.BillingServiceModule.*; 10 11 public class BillingServiceServer { 12 public static void main(String args[]) { 13 try{ 14 // create and initialize the ORB 15 ORB orb = ORB.init(args, null); 16 17 // get reference to rootpoa & activate the POAManager 18 POA rootpoa = 19 POAHelper.narrow(orb.resolve_initial_references("RootPOA")); 20 rootpoa.the_POAManager().activate(); 21 22 // create servant and register it with the ORB 23 BillingServiceImpl BSImpl = new BillingServiceImpl(); 24 BSImpl.setORB(orb); 25 26 // get object reference from the servant 27 org.omg.CORBA.Object ref = rootpoa.servant_to_reference(BSImpl); 28 BillingService href = BillingServiceHelper.narrow(ref); 29 30 // get the root naming context 31 // NameService invokes the name service 32 org.omg.CORBA.Object objRef = 33 orb.resolve_initial_references("NameService"); 34 // Use NamingContextExt which is part of the Interoperable 35 // Naming Service (INS) specification. 36 NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef); 37 38 // bind the Object Reference in Naming 39 String name = "BillingService"; 40 NameComponent path[] = ncRef.to_name( name ); 41 ncRef.rebind(path, href); 42 43 System.out.println("BillingServiceServer ready and waiting ..."); 44 45 // wait for invocations from clients 46 orb.run(); 47 } 48 49 catch (Exception e) { 50 System.err.println("ERROR: " + e); 51 e.printStackTrace(System.out); 52 } 53 System.out.println("BillingServer Exiting ..."); 54 } 55 }
- # Какие из следующих утверждений являются верными:
- # Какие из следующих утверждений являются верными:
- # Сервис именования CORBA это:
- # Какие из следующих утверждений являются верными:
- # Какие из следующих утверждений являются верными:
- # Роль "клиентской заглушки" автоматически создаваемой утилитой idlj состоит в:
- # Для определения интерфейса удаленного объекта, в IDL используется ключевое слово:
- # Роль "серверной заглушки" автоматически создаваемой утилитой idlj состоит в:
- # При объявлении методов в IDL, типы передаваемых в них аргументов должны:
- # API динамических вызовов используется:
- # Динамические скелетоны используются:
- # Какие из следующих утверждений являются верными:
- # Module BillingServiceModule (в определении BillingService.idl) при использовании утилиты idlj породит следующую синтаксическую конструкцию Java:
- # Описание Card getCard(in string card) в определении BillingService.idl означает, что метод getCard возвращает:
- # Описание Card addNewCard(in string personName, in string card) в определении BillingService.idl означает, что объектная ссылка Card, возвращаемая методом, "указывает" на:
- # В хэштаблице _cards (класс BillingServiceImpl) хранятся:
- # Какие из следующих утверждений являются верными:
- # Какие из следующих утверждений являются верными:
- # Класс CardImpl, это:
- # Класс BillingServiceServer, это:
- # В какой строке класса BillingServiceServer (листинг программы) создается объект, реализующий интерфейс BillingService, определенный в BillingService.idl:
- # В какой строке класса BillingServiceServer (листинг программы) объект, реализующий интерфейс BillingService, регистрируется в сервисе имен:
- # Для запуска примера потребуются следующие утилиты (при использовании реализации CORBA, включенной в пакет JDK):
- # Запуск приложения осуществляется в следующем порядке:
- # Как BillingServiceClient находит сервис имен:
- # Класс BillingServiceServer запускается на исполнение:
- # Создание класс BillingServiceServer с параметром при регистрации LifespanPolicyValue.PERSISTENT обеспечивает:
- # При использовании Dynamic Invocation Interface (DII) на стороне клиента, использование IDL для автоматического построения классов на стороне сервера:
- # При использовании Dynamic Dynamic Skeleton Interface (DSI) на стороне сервера, использование IDL для автоматического построения классов на стороне клиента:
- # Dynamic Invocation Interface (DII) и Dynamic Dynamic Skeleton Interface (DSI) используются:
- # Класс, использующий Dynamic Invocation Interface (DII) должен наследовать от:
- # Класс, использующий Dynamic Dynamic Skeleton Interface (DSI) должен наследовать от:
- # При использовании Dynamic Invocation Interface (DII) и Dynamic Dynamic Skeleton Interface (DSI) на классы накладываются следующие ограничения по наследованию:
- # Какие из следующих утверждений являются верными:
- # Класс, использующий Dynamic Dynamic Skeleton Interface (DSI), в методе invoke:
- # Класс, использующий Dynamic Dynamic Skeleton Interface (DSI), наследуя от класса DynamicImplementation должен реализовать метод(ы):
- # Какие из следующих утверждений являются верными:
- # При регистрации в сервисе имен класса, использующего DSI:
- # При регистрации в сервисе имен класса, использующего DII:
- # Какие из следующих утверждений являются верными:
- # При регистрации в сервисе имен класса, использующего DII:
- # При регистрации в сервисе имен класса, использующего DSI:
- # При запуске приложения, использующего DII:
- # При запуске приложения, использующего DSI:
- # При использовании DII, в случае, если сигнатура удаленного метода изменена, необходимо: