Рубрики
Без рубрики

Начало работы с Java RMI

Узнайте, как общаться между СПМ с помощью Java RMI.

Автор оригинала: baeldung.

1. Обзор

Когда два СПМ должны общаться, Java RMI является одним из вариантов, мы должны сделать это. В этой статье мы найдем простой пример, демонстрирующий технологию Java RMI.

2. Создание сервера

Для создания сервера RMI необходимо выработать два шага:

  1. Создайте интерфейс, определяющий контракт клиента/сервера.
  2. Создайте реализацию этого интерфейса.

2.1. Определение контракта

Прежде всего, давайте создадим интерфейс для удаленного объекта. Этот интерфейс расширяет java.rmi.Remote интерфейс маркера.

Кроме того, каждый метод, заявленный в интерфейсе, бросает java.rmi. Дистанционноеисключаемое :

public interface MessengerService extends Remote {
    String sendMessage(String clientMessage) throws RemoteException;
}

Обратите внимание, однако, что RMI поддерживает полную спецификацию Java для подписей метода, если типы Java java.io.Serializabl e .

В будущих разделах мы увидим, как клиент и сервер будут использовать этот интерфейс.

Для сервера мы создадим реализацию, которую часто называют Дистанционное .

Для клиента, библиотека RMI динамически создаст реализацию под названием Стуб .

2.2. Осуществление

Кроме того, давайте реализуем удаленный интерфейс, снова называемый Дистанционное :

public class MessengerServiceImpl implements MessengerService { 
 
    @Override 
    public String sendMessage(String clientMessage) { 
        return "Client Message".equals(clientMessage) ? "Server Message" : null;
    }

    public String unexposedMethod() { /* code */ }
}

Обратите внимание, что мы остановились на бросает Дистанционноеисключаемое пункт из определения метода.

Это было бы необычно для нашего удаленного объекта, чтобы бросить Дистанционноеисключаемое так как это исключение обычно зарезервировано для библиотеки RMI для повышения ошибок связи с клиентом.

Оставляя его также имеет преимущество сохранения нашей реализации RMI-агностик.

Кроме того, любые дополнительные методы, определенные в удаленном объекте, но не в интерфейсе, остаются невидимыми для клиента.

3. Регистрация Службы

Как только мы создаем удаленную реализацию, мы должны привязать удаленный объект к реестру RMI.

3.1. Создание заглушки

Во-первых, нам нужно создать заглушку нашего удаленного объекта:

MessengerService server = new MessengerServiceImpl();
MessengerService stub = (MessengerService) UnicastRemoteObject
  .exportObject((MessengerService) server, 0);

Мы используем статический UnicastRemoteObject.exportObject метод создания нашей реализации заглушки. Заглушка является то, что делает магию общения с сервером по базовому протоколу RMI.

Первый аргумент в экспортОбъект является объектом удаленного сервера.

Вторым аргументом является порт, который экспортОбъект для экспорта удаленного объекта в реестр.

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

К сожалению, метод без номера порта депрекирован.

3.2 Создание реестра

Мы можем встать реестра местных на наш сервер или в качестве отдельного отдельного сервиса.

Для простоты мы создадим локальный для нашего сервера:

Registry registry = LocateRegistry.createRegistry(1099);

Это создает реестр, к которому заглушки могут быть связаны серверами и обнаружены клиентами.

Кроме того, мы использовали создатьРегистрация метод, так как мы создаем локальный реестр для сервера.

По умолчанию реестр RMI работает в порту 1099. Скорее, другой порт также может быть указан в создатьРегистрация заводской метод.

Но в самостоятельном случае, мы бы назвали получитьРегистрация , прохождение имени хоста и номера порта в качестве параметров.

3.3 Связывание заглушки

Следовательно, давайте привядим нашу заглушку в реестр. Реестр RMI является именуемый объект, как JNDI и т.д. Мы можем следовать аналогичной схеме здесь, связывая нашу заглушку с уникальным ключом:

registry.rebind("MessengerService", stub);

В результате удаленный объект теперь доступен любому клиенту, который может найти реестр.

4. Создание клиента

Наконец, давайте напишем клиенту, чтобы вызвать удаленные методы.

Для этого мы сначала найдем реестр RMI. Кроме того, мы будем искать заглушку удаленного объекта с помощью ограниченного уникального ключа.

И, наконец, мы будем ссылаться на отправитьMessage метод:

Registry registry = LocateRegistry.getRegistry();
MessengerService server = (MessengerService) registry
  .lookup("MessengerService");
String responseMessage = server.sendMessage("Client Message");
String expectedMessage = "Server Message";
 
assertEquals(expectedMessage, responseMessage);

Поскольку мы запускаем реестр RMI на локальной машине и порте по умолчанию 1099, мы не переносим никаких параметров получитьРегистрация .

Действительно, если реестр находится скорее на другом хосте или другом порту, мы можем предоставить эти параметры.

Как только мы смотрим объект заглушки с помощью реестра, мы можем вызвать методы на удаленном сервере.

5. Заключение

В этом учебнике мы кратко познакомились с Java RMI и тем, как она может стать основой для приложений для клиентских серверов. Оставайтесь с нами для дополнительных сообщений о некоторых уникальных особенностей RMI!

Исходный код этого учебника можно найти в течение на GitHub .