Полезное для программистов:

Фриланс
Новости
Статьи
   
Рубрики:


RMI-IIOP на примере

Поиск:
RMI-IIOP на примере

1. Что такое RMI-IIOP? RMI over Internet Inter-ORB Protocol. Порпосту, это та же RMI, но с возможностями CORBA - "общаться" с сервисами не только на Java. RMI-IIOP используется, в частности, в EJB.

2. Как ни странно, для данного примера тянуть ничего не нужно. Мы воспользуемся сервером orbd (Object Request Broker Daemon) и его NS (Naming Service), поставляемым с J2SE.

3. В целом действия наши те же, что и при написании обычного RMI приложения. Однако, нам необходим JNDI для определения местонахождения сервиса, см. JNDI example.
Нашей задачей будет написать сервис, передающий текущее время в мс.

4. Начнем с ремоут интерфейса:
Код

import java.rmi.*;

public interface TimeService extends Remote
{
    long getTime() throws RemoteException;
}


5. Добавляем его реализацию
Код

import java.rmi.*;
import javax.rmi.*;

public class TimeServiceImpl extends PortableRemoteObject implements TimeService
{
    public TimeServiceImpl() throws RemoteException
    {}

    public synchronized long getTime() throws RemoteException
    {
            return System.currentTimeMillis();
    }
}

Здесь видно 2 отличия от RMI JRMP (Java Remote Method Protocol): класс наследует от PortableRemoteObject, конструктор должен бросать RemoteException.

6. Пишем сервер:
Код

import javax.naming.*;

public class Server
{
    public static void main(String[] args) throws Exception
    {
        TimeServiceImpl service = new TimeServiceImpl();
        Context ctx = new InitialContext();
        ctx.rebind("TimeService", service);
        System.out.println("Service is bound");
        synchronized(service)
        {
            service.wait();
        }
    }
}

Мы пользуем JNDI, поэтому объект TimeServiceImpl неободимо привязать к контексту.

7. Клиент:
Код

import javax.naming.*;
import javax.rmi.*;

public class Client
{
    public static void main(String[] args) throws Exception
    {
        Context ctx = new InitialContext();
        Object service = ctx.lookup("TimeService");
        TimeService impl = (TimeService) PortableRemoteObject.narrow(service, TimeService.class);
        System.out.println("Service is found, time is " + impl.getTime());
    }
}

Заметим главное отличие от примера с File Service: использование метода PortableRemoteObject.narrow. Мы не можем сделать простой кастинг в TimeService, поскольку совсем необязательно, что полученный объект (точнее, стаб) - это Java объект.

8. Теперь нужно скомпилить все классы:
javac *.java

9. Следующий шаг - создать стаб и скелет для RMI-IIOP. Запускаем rmi компилятор с опцией -iiop
rmic -iiop TimeServiceIpml

10. Запускаем сервер на порту 1999 (собственно, на любом свободном):
orbd -ORBInitialPort 1999

(для винды : start orbd -ORBInitialPort 1999
)

11. Запускаем сервис:
java -Djava.naming.factory.initial=com.sun.jndi.cosnaming.CNCtxFactory -Djava.naming.provider.url=iiop://localhost:1999 Server

Кстати, это еще один способ передать параметры в InitialContext, - помимо описанных в примере про JNDI.

12. Запускаем клиента:
java -Djava.naming.factory.initial=com.sun.jndi.cosnaming.CNCtxFactory -Djava.naming.provider.url=iiop://localhost:1999 Client

Service is found, time is 1110824870448
Автор: Domestic Cat






Просмотров: 3399

 

 

Новые статьи:


Популярные:
  1. Как сделать цикличным проигрывание MIDI-файла?
  2. Создание AVI файла из рисунков
  3. Как устройство "отключить в данной конфигурации"?
  4. Kто в данный момент присоединен через Сеть?
  5. Как узнать количество доступной памяти?
  6. Как реализовать в RichEdit разноцветный текст?
  7. Как скрыть свое приложение от ProcessViewer
  8. Как программно нажать/скрыть/показ кнопку "Start"?
  9. Модуль работы с ресурсами в PE файлах
10. Функции вызова диалоговых окон выбора
11. Проверка граматики средствами Word'а из Delphi.
12. Модуль для упрощенного вызова сообщений
13. Функции для записи и чтение своих данных в, ЕХЕ- файле
14. Рекурсивный просмотр директорий
15. Network Traffic Monitor
16. Разные модули
17. Универсальная функция для обращения к любым экспортируем функциям DLL
18. Библиотека от VladS
19. Протектор для UPX'а
20. Еще об ICQ, сообщения по контакт листу?
21. Использование открытых интерфейсов
22. Теория и практика использования RTTI
23. Работа с TApplication
24. Примеры использования Drag and Drop для различных визуальных компонентов
25. Что такое порт? Правила для работы с портами
26. Симфония на клавиатуре
27. Загрузка DLL
28. Исправление автоинкремента
29. Взаимодействие с чужими окнами
30. Проверить дубляжи в столбце


 

 

 
 
На главную