Spec-Zone .ru
спецификации, руководства, описания, API
|
Это учебное руководство показывает Вам шаги, чтобы следовать, чтобы создать распределенную версию классики "Привет Мировая" программа, используя Java Удаленный Вызов метода (RMI) по интернет-Протоколу Межшара (IIOP). IIOP RMI добавляет CORBA (Общая Архитектура Посредника запросов к объектам) возможность к Java RMI, обеспечивая основанную на стандартах функциональную совместимость и связь ко многим другим языкам программирования и платформам. Включения IIOP RMI распределяли Веб-поддерживающие приложения Java, чтобы прозрачно вызвать операции на удаленные сетевые службы, используя IIOP промышленного стандарта, определенный Группой по управлению объектами. Компоненты времени выполнения включают ШАР Java для распределенных вычислений, используя передачу IIOP.
IIOP RMI для программистов Java, которые хотят программировать к интерфейсам RMI, но IIOP использования как базовый транспорт. IIOP RMI предоставляет функциональной совместимости другие объекты CORBA, реализованные на различных языках - но только если все удаленные интерфейсы первоначально определяются как Java интерфейсы RMI. Это особенно интересно к Предприятию использования программистов JavaBeans (EJB), так как модель удаленного объекта для EJBs основана на RMI.
Другие опции для того, чтобы создать распределенные приложения:
IDL Java для программистов CORBA, которые хотят программировать в языке программирования Java, основанном на интерфейсах, определенных в Языке определения интерфейсов CORBA (IDL). Это - "обычный бизнес" программирование CORBA, поддерживая Java точно таким же образом как другие языки как C++ или КОБОЛ.
Java система RMI позволяет объекту, работающему в одной виртуальной машине Java (VM) вызывать методы на объект, работающий в другом Java VM. RMI предусматривает удаленную передачу между программами, записанными в языке программирования Java через Java Удаленный Протокол Метода (JRMP).
Распределенный Привет Мировой пример использует клиентское приложение, чтобы сделать удаленный вызов метода через IIOP к серверу, работающему на узле, с которого был загружен клиент. Когда клиент работает, "Привет от МАРСА!" выводится на экран.
Это учебное руководство организуется следующим образом:
Каждый шаг в учебном руководстве обозначается этим символом.
Есть три задачи завершиться в этом разделе:
HelloInterface.java
- удаленный интерфейсHelloImpl.java
- реализация удаленного объекта, которая реализует HelloInterface
HelloServer.java
- сервер RMI, который создает экземпляр реализации удаленного объекта и связывает тот экземпляр с именем в Службе ИменованияHelloClient.java
- клиентское приложение, которое вызывает удаленный метод, sayHello()
Следуйте за шагами ниже, чтобы создать исходные файлы или загрузить и разархивировать HelloRMIIIOP.zip.
Remote
интерфейс. Ваш удаленный интерфейс объявит каждый из методов, которые требуется вызвать от других машин. У удаленных интерфейсов есть следующие характеристики: public
. Иначе, клиент получит ошибку, пытаясь загрузить удаленный объект, который реализует удаленный интерфейс, если тот клиент не находится в том же самом пакете как удаленный интерфейс.java.rmi.Remote
интерфейс.java.rmi.RemoteException
(или суперкласс RemoteException
) в throws
пункт, в дополнение к любым специализированным исключениям.HelloInterface
) не класс реализации (HelloImpl
).Для этого примера создайте все исходные файлы в том же самом каталоге, например, $HOME/mysrc/helloWorld
.
Создайте файл HelloInterface.java. Следующий код является интерфейсным определением для удаленного интерфейса, HelloInterface
, который содержит только один метод, sayHello
:
//HelloInterface.java import java.rmi.Remote; public interface HelloInterface extends java.rmi.Remote { public void sayHello( String from ) throws java.rmi.RemoteException; }
java.rmi.RemoteException
. Если Вы хотите больше информации об отказе и восстановлении в распределенных системах, можно хотеть считать Как минимум, класс реализации удаленного объекта, HelloImpl.java
должен:
Создайте файл HelloImpl.java. Код для этого файла следует. Объяснение каждого из предыдущих шагов следует за исходным кодом:
//HelloImpl.java import javax.rmi.PortableRemoteObject; public class HelloImpl extends PortableRemoteObject implements HelloInterface { public HelloImpl() throws java.rmi.RemoteException { super(); // invoke rmi linking and remote object initialization } public void sayHello( String from ) throws java.rmi.RemoteException { System.out.println( "Hello from " + from + "!!" ); System.out.flush(); } }
В языке программирования Java, когда класс объявляет, что это реализует интерфейс, контракт формируется между классом и компилятором. Заключая этот контракт, класс обещает, что это обеспечит тела метода, или определения, для каждых из сигнатур методов, объявленных в том интерфейсе. Интерфейсные методы неявно public
и abstract
, так, если класс реализации не выполняет свой контракт, это становится по определению abstract
класс, и компилятор укажут на этот факт, если класс не был объявлен abstract
.
Класс реализации в этом примере HelloImpl
. Класс реализации объявляет, какой удаленный интерфейс (ы) он реализует. Вот HelloImpl
объявление класса:
public class HelloImpl extends PortableRemoteObject implements HelloInterface{Как удобство, класс реализации может расширить удаленный класс, который в этом примере является
javax.rmi.PortableRemoteObject
. Расширяясь PortableRemoteObject
, HelloImpl
класс может использоваться, чтобы создать удаленный объект, который использует основанный на IIOP транспорт для передачи.
Кроме того, экземпляр удаленного объекта должен будет быть "экспортирован". Экспорт удаленного объекта делает доступным, чтобы принять входящие удаленные запросы метода, прислушиваясь к входящим вызовам к удаленному объекту на анонимном порту. Когда Вы расширяетесь javax.rmi.PortableRemoteObject
, Ваш класс будет экспортироваться автоматически после создания.
Поскольку объектный экспорт мог потенциально бросить a java.rmi.RemoteException
, следует определить конструктора, который бросает a RemoteException
, даже если конструктор не делает ничего иного. Если Вы забываете конструктора, javac
произведет следующее сообщение об ошибке:
HelloImpl.java:3: unreported exception java.rmi.RemoteException; must be caught or declared to be thrown. public class HelloImpl extends PortableRemoteObject implements HelloInterface{ ^ 1 errorРассмотреть: класс реализации для удаленного объекта нуждается к:
java.rmi.RemoteException
HelloImpl
класс: public HelloImpl() throws java.rmi.RemoteException { super(); }Отметьте следующее:
super
вызов метода вызывает конструктора без параметров javax.rmi.PortableRemoteObject
, который экспортирует удаленный объект.java.rmi.RemoteException
, потому что попытка RMI экспортировать удаленный объект во время конструкции могла бы перестать работать, если коммуникационные ресурсы не доступны.Хотя звонок в конструктора суперкласса без параметров, super()
, происходит по умолчанию (даже если опущенный), это включается в этот пример, чтобы ясно дать понять факт, что суперкласс будет создан перед классом.
sayHello()
метод, который возвращает строку "Привет из МАРСА!!" к вызывающей стороне: public void sayHello( String from ) throws java.rmi.RemoteException { System.out.println( "Hello from " + from + "!!"); System.out.flush(); }Параметры, или возвращаемые значения от, удаленные методы могут быть любым типом данных для платформы Java, включая объекты, пока те объекты реализуют интерфейс
java.io.Serializable
. Большинство базовых классов в java.lang
и java.util
реализуйте Serializable
интерфейс. В RMI: static
или transient
. Пожалуйста, обратитесь к Спецификации Сериализации Объекта Java для информации о том, как изменить поведение сериализации по умолчанию.rmic
генерировать тупики и скелеты.Класс сервера является классом, у которого есть a main
метод, который создает экземпляр реализации удаленного объекта, и связывает тот экземпляр с именем в Службе Именования. Класс, который содержит это main
метод мог быть классом реализации непосредственно, или другим классом полностью.
В этом примере, main
метод является частью HelloServer.java
, который делает следующее:
Создайте файл HelloServer.java. Исходный код для этого файла следует. Объяснение каждого из предыдущих шагов следует за исходным кодом:
//HelloServer.java import javax.naming.InitialContext; import javax.naming.Context; public class HelloServer { public static void main(String[] args) { try { // Step 1: Instantiate the Hello servant HelloImpl helloRef = new HelloImpl(); // Step 2: Publish the reference in the Naming Service // using JNDI API Context initialNamingContext = new InitialContext(); initialNamingContext.rebind("HelloService", helloRef ); System.out.println("Hello Server: Ready..."); } catch (Exception e) { System.out.println("Trouble: " + e); e.printStackTrace(); } } }
main
метод сервера должен создать экземпляр реализации удаленного объекта, или Слугу. Например: HelloImpl helloRef = new HelloImpl();Конструктор экспортирует удаленный объект, что означает, что когда-то создаваемый, удаленный объект готов принять входящие вызовы.
Как только удаленный объект регистрируется на сервере, вызывающие стороны могут искать объект по имени (использующий службу именования), получить ссылку удаленного объекта, и затем удаленно вызвать методы на объект. В этом примере мы используем Службу Именования, которая является частью Демона Посредника запросов к объектам (orbd
).
Например, следующий код связывает имя "HelloService" со ссылкой для удаленного объекта:
// Step 2: Publish the reference in the Naming Service // using JNDI API Context initialNamingContext = new InitialContext(); initialNamingContext.rebind("HelloService", helloRef );
Отметьте неотступно следование за параметрами rebind
вызов метода:
"HelloService"
, a java.lang.String
, представление имени удаленного объекта, чтобы связатьhelloRef
объектный идентификатор удаленного объекта, чтобы связатьКлиентское приложение в этом примере удаленно вызывает sayHello
метод, чтобы получить строку "Привет от МАРСА!!" чтобы вывести на экран, когда клиентское приложение работает.
Создайте файл HelloClient.java. Вот исходный код для клиентского приложения:
//HelloClient.java import java.rmi.RemoteException; import java.net.MalformedURLException; import java.rmi.NotBoundException; import javax.rmi.*; import java.util.Vector; import javax.naming.NamingException; import javax.naming.InitialContext; import javax.naming.Context; public class HelloClient { public static void main( String args[] ) { Context ic; Object objref; HelloInterface hi; try { ic = new InitialContext(); // STEP 1: Get the Object reference from the Name Service // using JNDI call. objref = ic.lookup("HelloService"); System.out.println("Client: Obtained a ref. to Hello server."); // STEP 2: Narrow the object reference to the concrete type and // invoke the method. hi = (HelloInterface) PortableRemoteObject.narrow( objref, HelloInterface.class); hi.sayHello( " MARS " ); } catch( Exception e ) { System.err.println( "Exception " + e + "Caught" ); e.printStackTrace( ); return; } } }
Во-первых, клиентское приложение получает ссылку на реализацию удаленного объекта (рекламируемый как "HelloService") от Службы Именования, используя Интерфейс Именования и Каталога Java [ТМ] (JNDI) вызовы. Как Naming.rebind
метод, Naming.lookup
метод берет java.lang.String
значение, представляющее имя объекта искать. Вы предоставляете Naming.lookup() имя объекта, который Вы хотите искать, и это возвращает объект, связанный с тем именем. Naming.lookup() возвращает тупик для удаленной реализации Hello
взаимодействуйте через интерфейс к его вызывающей стороне (HelloClient
).
sayHello()
метод на удаленном объекте сервера, вызывая строку "Привет от МАРСА!!" быть выведенным на экран на командной строке.HelloInterface.java
содержит исходный код для удаленного интерфейсаHelloImpl.java
содержит исходный код для реализации удаленного объектаHelloServer.java
содержит исходный код для сервераHelloClient.java
содержит исходный код для клиентского приложенияHelloImpl.java
, чтобы создать .class
файлы должны были работать rmic
. Вы тогда работаете rmic
компилятор, чтобы создать тупики и скелеты. Тупик является прокси клиентской стороны для удаленного объекта, который вперед IIOP RMI призывает к диспетчеру серверной стороны, который поочередно вперед звонок в фактическую реализацию удаленного объекта. Последняя задача состоит в том, чтобы скомпилировать остающееся .java
исходные файлы, чтобы создать .class
файлы. Следующие задачи будут завершены в этом разделе:
rmic
генерировать тупики и скелетыСоздать тупик и скелетные файлы, rmic
компилятор должен быть выполнен на полностью определенных именах пакета скомпилированных файлов класса, которые содержат реализации удаленного объекта. В этом примере файл, который содержит реализации удаленного объекта, HelloImpl.java
. Генерировать тупики и скелеты:
Скомпилировать HelloImpl.java
, следующим образом:
javac -d . -classpath . HelloImpl.java
"-d .
"опция указывает, что сгенерированные файлы должны быть помещены в каталог, из которого Вы выполняете компилятор."-classpath .
"опция указывает на это файлы на который HelloImpl.java
зависит может быть найден в этом каталоге.
rmic
генерировать скелеты и тупикиrmic
компилятор с -iiop
опция. rmic -iiop
команда берет одни или более имен классов в качестве параметра и производит файлы класса формы _HelloImpl_Tie.class
и _HelloInterface_Stub.class
. Удаленный файл реализации, HelloImpl.class
, имя класса, чтобы передать в этом примере. Для объяснения rmic
опции, можно сослаться на Солярис rmic
страница руководства или Windows rmic
страница руководства.
Создать тупик и скелет для HelloImpl
реализация удаленного объекта, выполненная rmic
как это:
rmic -iiop HelloImpl
Предыдущая команда создает следующие файлы:
_HelloInterface_Stub.class
- клиентский тупик_HelloImpl_Tie.class
- скелет сервераСкомпилируйте исходные файлы следующим образом:
javac -d . -classpath . HelloInterface.java HelloServer.java HelloClient.java
Эта команда создает файлы класса HelloInterface.class
, HelloServer.class
, и HelloClient.class
. Они - удаленный интерфейс, сервер, и клиентское приложение соответственно. Для объяснения javac
опции, можно сослаться на Солярис javac
страница руководства или Windows javac
страница руководства.
orbd
, который включает и Переходный процесс и Персистентную Службу Именования, и доступен с каждой загрузкой J2SE 1.4 и выше. Для вызывающей стороны (клиент, коллега, или клиентское приложение), чтобы быть в состоянии вызвать метод на удаленный объект, та вызывающая сторона должна сначала получить ссылку на удаленный объект.
Как только удаленный объект регистрируется на сервере, вызывающие стороны могут искать объект по имени, получить ссылку удаленного объекта, и затем удаленно вызвать методы на объект.
Запустите Службу Именования, работая orbd
из командной строки.
Для этого примера, на операционной системе Соляриса:
orbd -ORBInitialPort 1050&
или, на операционной системе Windows:
start orbd -ORBInitialPort 1050
Следует определить порт, на котором можно работать orbd
. Для этого примера порт 1050
выбирается, потому что в операционной среде Соляриса, пользователь должен стать корнем, чтобы запустить процесс на порту под 1024. Для больше на orbd
инструмент, можно обратиться к orbd
страница руководства.
Следует остановить и перезапустить сервер любое время, Вы изменяете удаленный интерфейс или используете измененные/дополнительные удаленные интерфейсы в реализации удаленного объекта. Иначе, тип ссылки на объект, связанной в Службе Именования, не будет соответствовать измененный класс.
Откройте другое окно терминала и изменитесь на каталог, содержащий исходные файлы для этого примера. Команда для того, чтобы выполнить клиент была распространена ниже, чтобы облегчить читать, но должна быть введена без возвратов между строками. Следующая команда показывает, как запустить HelloServer
сервер. Если Вы использовали порт кроме 1050 или узел кроме localhost
запускаясь orbd
инструмент, замените те значения в команде ниже с фактическими значениями, используемыми, чтобы запустить orbd
.
Запустите Привет сервер, следующим образом:
java -classpath . -Djava.naming.factory.initial=com.sun.jndi.cosnaming.CNCtxFactory -Djava.naming.provider.url=iiop://localhost:1050 HelloServer
Для объяснения java
опции, можно сослаться на Солярис java
страница руководства или Windows java
страница руководства.
Вывод должен быть похожим на это:
Hello Server: Ready ...
localhost
запускаясь orbd
инструмент, замените те значения в команде ниже с фактическими значениями, используемыми, чтобы запустить orbd
. Запустите клиентское приложение, следующим образом:
java -classpath . -Djava.naming.factory.initial=com.sun.jndi.cosnaming.CNCtxFactory -Djava.naming.provider.url=iiop://localhost:1050 HelloClientПосле выполнения клиентского приложения Вы будете видеть вывод, подобный следованию Вашего дисплея в клиентском окне:
Client: Obtained a ref. to Hello server.
Следующее сообщение выведет на экран в окне сервера:
Hello from MARS
ORBD и Привет сервер будет продолжать работать, пока они не будут явно остановлены. На Солярисе можно остановить эти процессы, используя pkill orbd
и pkill HelloServer
команды из окна терминала. На Windows можно ввести Ctrl+C
в быстром окне, чтобы уничтожить процесс.
Это завершает основное учебное руководство IIOP RMI. Если Вы готовы идти дальше к более сложным приложениям, вот некоторые источники, которые могут помочь: