Опубликован: 10.10.2010 | Доступ: свободный | Студентов: 3055 / 200 | Оценка: 4.14 / 3.32 | Длительность: 13:16:00
ISBN: 978-5-9963-0444-8
Специальности: Системный архитектор
Лекция 8:

CORBA. Второй пример

< Лекция 7 || Лекция 8: 1234 || Лекция 9 >
Аннотация: В лекции приводится пример использования механизма объектных ссылок и персистентных объектов

Рабочий каталог расположен в Practice.

Следующий пример будет отличаться от предыдущего тем, что в нем будут реализованы методы, оперирующие объектными ссылками. В отличие от предыдущего примера, определим Card как интерфейс, обладающий методами изменения баланса. Объекты типа Card будут создаваться в процессе работы системы, и ссылки на них будут возвращаться клиенту соответствующими методами.

Таким образом, доступ к объектам этого типа будет осуществляться не посредством обращения к сервису имен, а посредством получения объектной ссылки.

Файл BillingService.idl

Файл BillingService.idl содержит описание двух интерфейсов: Card и BillingService.Интерфейс Card содержит три метода: addMoney (добавляет денежные средства на карту), subMoney (снимает денежные средства с карты), getCardBalance (показывает текущий баланс карты). Интерфейс BillingService включает два метода: addNewCard (добавляет новую карту) и getCard (возвращает объектную ссылку на карту с указанным номером).

В примере 8.1 приведено IDL -описание сервера BillingService.

1  // BillingService.idl
2  // IDL-описание BillingService
3  module    BillingServiceModule 
4  {
5  interface Card 
6  {
7  void addMoney(in double money);
8  void subMoney(in double money);
9  double getBalance();
10  };
11  interface BillingService
12  {
13  Card getCard(in string card);
14  Card addNewCard(in string personName, in string card);
15  };
16  };
Листинг 8.1. IDL-описание сервера BillingService

Следующим шагом в реализации нашего приложения будет генерация из IDL -определения вспомогательных классов.

После компиляции файла BillingService.idl компилятор Java-IDL создает следующие файлы на стороне сервера в вновь созданной директории BillingServiceModule:

BillingService.java,
BillingServiceHelper.java,
BillingServiceHolder.java,
BillingServiceOperations.java,
BillingServicePOA.java,
_BillingServiceStub.java,
Card.java,
CardHelper.java,
CardHolder.java,
CardOperations.java,
CardPOA.java,
_CardStub.java.

Рассмотрим подробнее эти файлы (в этих файлах определены классы и интерфейсы языка java ) и то, как мы можем их использовать при создании нашего приложения.

BillingService.java и BillingServiceOperations.java - интерфейсы. BillingService.java (пример 8.2) представляет собой интерфейс BillingService.

1  package com.asw.corba.ex2.BillingServiceModule;
2
3
4 /**
5 * com/asw/corba/ex2/BillingServiceModule/BillingService.java . 
6 * Generated by the IDL-to-Java compiler (portable), version "3.1" 
7 * from com/asw/corba/ex2/BillingService.idl
8 * 16 Июль 2006 г. 15:01:11 MSD
9 */
10
11  public interface BillingService extends BillingServiceOperations,
12  org.omg.CORBA.Object, org.omg.CORBA.portable.IDLEntity
13  {
14  } // interface BillingService
Листинг 8.2. Интерфейс BillingService, созданный idlj

В строках 11 и 12 объявлены интерфейс BillingService и три интерфейса, от которых наследует BillingService.Как уже говорилось, два из этих трех интерфейсов являются определенными в CORBA типами, от которых должны наследовать все CORBA -совместимые объекты, org.omg.CORBA.Object и org.omg.CORBA.portable.IDLEntity.Третий интерфейс - BillingServiceOperations (пример 8.3) - создается на основе IDL -описания и объявляет открытые операции данного сервера. BillingService определяет базовый класс, который наследует от BillingServiceOperations и от CORBA -интерфейсов, упомянутых ранее. BillingServiceOperations объявляет два метода, изначально определенные в IDL.

1  package com.asw.corba.ex2.BillingServiceModule;
2 
3
4 /**
5 * com/asw/corba/ex2/BillingServiceModule/BillingServiceOperations.java . 
6 * Generated by the IDL-to-Java compiler (portable), version "3.1" 
7 * from com/asw/corba/ex2/BillingService.idl
8 * 16 Июль 2006 г. 15:01:11 MSD
9 */
10
11  // определение CORBA-совместимого сервиса
12  public interface BillingServiceOperations
13  {
14  com.asw.corba.ex2.BillingServiceModule.Card getCard (String card);
15  com.asw.corba.ex2.BillingServiceModule.Card addNewCard 
  (String personName, String card);
16  } // interface BillingServiceOperations
Листинг 8.3. Интерфейс BillingServiceOperations, созданный idlj

Файлы BillingServiceHelper.java (пример 8.4) и BillingServiceHolder.java (пример 8.5) содержат методы приведения типов и методы маршаллинга/демаршаллинга сообщений.

1  package com.asw.corba.ex2.BillingServiceModule;
2 
3
4 /**
5 * com/asw/corba/ex2/BillingServiceModule/BillingServiceHelper.java
6 * Generated by the IDL-to-Java compiler (portable), version "3.1" 
7 * from com/asw/corba/ex2/BillingService.idl 
8 * 16 Июля 2006 г. 15:01:11 MSD 
9 */
10
11  // определение класса BillingServiceHelper
12  abstract public class BillingServiceHelper
13  {
14  private static String _id = 
  "IDL:BillingServiceModule/BillingService:1.0";
15
16  public static void insert (org.omg.CORBA.Any a, 
  com.asw.corba.ex2.BillingServiceModule.BillingService that)
17  {
18  org.omg.CORBA.portable.OutputStream out = a.create_output_stream ();
19  a.type (type ());
20  write (out, that);
21  a.read_value (out.create_input_stream (), type ());
22  }
23
24  public static com.asw.corba.ex2.BillingServiceModule.BillingService 
  extract (org.omg.CORBA.Any a)
25  {
26  return read (a.create_input_stream ());
27  }
28
29  private static org.omg.CORBA.TypeCode__typeCode = null;
30
31  synchronized public static org.omg.CORBA.TypeCode type ()
32  {
33  if (__typeCode == null)
34  {
35  __typeCode = org.omg.CORBA.ORB.init ().create_interface_tc
  (com.asw.corba.ex2.BillingServiceModule.BillingServiceHelper.id (), 
  "BillingService");
36  }
37  return __typeCode;
38  }
39
40  public static String id ()
41  {
42  return _id;
43  }
44
45  public static com.asw.corba.ex2.BillingServiceModule.BillingService 
  read (org.omg.CORBA.portable.InputStream istream)
46  {
47  return narrow (istream.read_Object (_BillingServiceStub.class));
48  }
49
50  public static void write (org.omg.CORBA.portable.OutputStream ostream, 
  com.asw.corba.ex2.BillingServiceModule.BillingService value)
51  {
52  ostream.write_Object ((org.omg.CORBA.Object) value);
53  }
54
55  public static com.asw.corba.ex2.BillingServiceModule.BillingService 
  narrow (org.omg.CORBA.Object obj)
56  {
57  if (obj == null)
58  return null;
59  else if (obj instanceof 
  com.asw.corba.ex2.BillingServiceModule.BillingService)
60  return (com.asw.corba.ex2.BillingServiceModule.BillingService)obj;
61  else if (!obj._is_a (id ()))
62  throw new org.omg.CORBA.BAD_PARAM ();
63  else
64  {
65  org.omg.CORBA.portable.Delegate delegate = 
  ((org.omg.CORBA.portable.ObjectImpl)obj)._get_delegate ();
66  com.asw.corba.ex2.BillingServiceModule._BillingServiceStub stub = 
  new com.asw.corba.ex2.BillingServiceModule._BillingServiceStub ();
67  stub._set_delegate(delegate);
68  return stub;
69  }
70  }
71  }
Листинг 8.4. Класс BillingServiceHelper, созданный idlj
1  package com.asw.corba.ex2.BillingServiceModule;
2
3 /**
4 *  com/asw/corba/ex2/BillingServiceModule/BillingServiceHolder.java .
5 *  Generated by the IDL-to-Java compiler (portable), version "3.1"
6 *  from com/asw/corba/ex2/BillingService.idl
7 *  16 Июль 2006 г. 15:01:11 MSD
8 */
9
10  // определение класса BillingServiceHolder
11  public final class BillingServiceHolder implements 
  org.omg.CORBA.portable.Streamable
12  {
13  public com.asw.corba.ex2.BillingServiceModule.BillingService value
  = null;
14
15  public BillingServiceHolder ()
16  {
17  }
18
19  public BillingServiceHolder 
  (com.asw.corba.ex2.BillingServiceModule.BillingService initialValue)
20  {
21  value = initialValue;
22  }
23
24  public void _read (org.omg.CORBA.portable.InputStream i)
25  {
26  value =
  com.asw.corba.ex2.BillingServiceModule.BillingServiceHelper.read (i);
27  }
28
29  public void _write (org.omg.CORBA.portable.OutputStream o)
30  {
31  com.asw.corba.ex2.BillingServiceModule.BillingServiceHelper.write 
  (o, value);
32  }
33
34  public org.omg.CORBA.TypeCode _type ()
35  {
36  return
  com.asw.corba.ex2.BillingServiceModule.BillingServiceHelper.type ();
37  }
38  }
Листинг 8.5. Класс BillingServiceHolder, созданный idlj
< Лекция 7 || Лекция 8: 1234 || Лекция 9 >
Алмаз Мурзабеков
Алмаз Мурзабеков
Прохожу курс "Построение распределенных систем на Java" в третьей лекции где описывается TCPServer вылетает эта ошибка
"Connection cannot be resolved to a type"


Java version 1.7.0_05