Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > RMI-IIOP на примере


Автор: Domestic Cat 14.3.2005, 22:07
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 для определения местонахождения сервиса, см. http://forum.vingrad.ru/index.php?showtopic=45382.
Нашей задачей будет написать сервис, передающий текущее время в мс.

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)