Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> RMI-IIOP на примере 
:(
    Опции темы
Domestic Cat
Дата 14.3.2005, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



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



--------------------

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0780 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.