RMI: Основы на примере

 
 
 
Сообщения:1688
Выставляемый удалённый интерфейс:
package ru.javatalks.rmi;

import java.rmi.*;

public interface RemoteHelloService extends Remote {

	Object sayHello(String name) throws RemoteException;

}


Реализация удалённого интерфейса + сервер (создание RMI реестра в методе main)
package ru.javatalks.rmi;

import java.rmi.*;
import java.rmi.registry.*;
import java.rmi.server.*;

public class RemoteHelloServiceImpl implements RemoteHelloService {

	public static final String BINDING_NAME = "sample/HelloService";

	public Object sayHello(String name) {
		String string = "Hello, " + name + "! It is " + System.currentTimeMillis() + " ms now";
		try {
			System.out.println(name + " from " + UnicastRemoteObject.getClientHost());
		} catch (ServerNotActiveException e) {
			System.out.println(e.getMessage());
		}
		if ("Killer".equals(name)) {
			System.out.println("Shutting down...");
			System.exit(1);
		}
		return string;
	}

	public static void main(String... args) throws Exception {
		System.out.print("Starting registry...");
		final Registry registry = LocateRegistry.createRegistry(2099);
		System.out.println(" OK");

		final RemoteHelloService service = new RemoteHelloServiceImpl();
		Remote stub = UnicastRemoteObject.exportObject(service, 0);

		System.out.print("Binding service...");
		registry.bind(BINDING_NAME, stub);
		System.out.println(" OK");

		while (true) {
			Thread.sleep(Integer.MAX_VALUE);
		}
	}
}


Клиент:

package ru.javatalks.rmi;

import java.rmi.registry.*;

public class HelloServiceClient {

	public static void main(String... args) throws Exception {
		Registry registry = LocateRegistry.getRegistry("localhost", 2099);
		RemoteHelloService service = (RemoteHelloService) registry.lookup("sample/HelloService");
		String[] names = { "John", "Jan", "Иван", "Johan", "Hans", "Bill", "Kill" };
		for (String name : names) {
			System.out.println(service.sayHello(name));
		}
	}

}


Сначала запускается сервер, потом клиент. На порту 2099, сервер создаёт и запускает RMI реестр.
 
 
Сообщения:53
А почему при выполнении кода сервера, если убрать декларацию throws RemoteException в интерфейсе, возникнет исключение. ExportException: remote object implements illegal remote interface
 
 
Сообщения:586
По спецификации RMI каждый метод удаленного интерфейса должен бросать RemoteException. Это логично, т.к. нужно быть готовым к тому, что удаленный вызов всегда может завершиться ошибкой. Не логично, что данное исключение проверяемое, checked. Как правило ошибку удаленного вызова невозможно обработать корректно, максимум что можно сделать - повторить вызов через некоторое время, но для этого необязательно перехватывать в коде проверяемое исключение, лучше сделать общий для всех взаимодействующих с удаленным сервисом методов интерцептор. Впрочем, в библиотеке Java очень много таких неоднозначностей с исключениями, тот же JNDI справедливо за это ругают.
Изменен:27 мая 2014 13:19
 
 
Сообщения:12
Спасибо за пример, пока что единственный, что я смог запустить.
Подскажите, пожалуйста, почему вот тут просят запускать rmiregistry, ведь и без неё работает?
 
 
Сообщения:2
если не ошибаюсь в java 7 он запускается по умолчанию (неявно).
 
Модераторы:Нет
Сейчас эту тему просматривают:Нет