
Параметры в одной jvm
Простые параметры
Когда в качестве параметра в удаленный метод передается простой тип данных, RMI-система передает их по значению. RMI делает копию простого типа данных и передает ее в удаленный метод. Если метод возвращает простой тип данных, также используется передача по значению.
Значения передаются между JVM в стандартном, машинно-независимом формате. Это позволяет JVM, работающим на разных платформах, надежно взаимодействовать друг с другом.
Объектные параметры
Когда в удаленный метод передается объект, семантика отличается от семантики, используемой в случае с одной JVM. RMI передает между JVM сам объект, а не ссылку на него. Т.е., объект передается по значению. Подобным же образом, когда удаленный метод возвращает объект, в вызывающую программу передается полная копия объекта.
В отличие от простых типов данных, передача объекта в удаленную JVM – не простая задача. Объект Java может быть простым и самодостаточным, но может содержать сложную, похожую на граф, структуру ссылок на другие объекты Java. Поскольку различные JVM не разделяют динамическую память, RMI должен послать указанный объект и все объекты, на которые он ссылается. (Передача большой структуры объектов может потребовать много времени процессора и пропускной способности сети.)
RMI использует технологию, называемую сериализацией объектов, для преобразования объекта в линейный формат, который затем может быть передан по сети. Сериализация объекта, по существу, выравнивает объект и все объекты, на которые он ссылается. Сериализованные объекты могут быть десериализованы в памяти удаленной JVM и подготовлены к использованию программой Java.
Удаленные объектные параметры
RMI представляет третий тип параметров: удаленные объекты. Как вы уже видели, удаленная программа может получить ссылку на удаленный объект через реестр RMI. Существует другой способ передачи клиенту ссылки на удаленный интерфейс – она может быть возвращена клиенту из вызова метода.
/**
* @version 1.00 1996-09-07
* @author Cay Horstmann
*/
import java.rmi.*;
public interface Product extends Remote
{ String getDescription()
throws RemoteException;
}
public class ProductImpl
extends UnicastRemoteObject
implements Product
{
public ProductImpl(String n)
throws RemoteException
{ name = n;
}
public String getDescription()
throws RemoteException
{ return "I am a " + name + ". Buy me!";
}
private String name;
}
package Product;
/**
* @version 1.10 1999-08-21
* @author Cay Horstmann
*/
import java.rmi.*;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.*;
import sun.applet.*;
public class ProductServer
{ public static void main(String args[])
{ try
{ System.out.println
("Constructing server implementations...");
ProductImpl p1
= new ProductImpl("Blackwell Toaster");
ProductImpl p2
= new ProductImpl("ZapXpress Microwave Oven");
System.out.println
("Binding server implementations to registry...");
//Naming.bind("toaster", p1);
//Naming.bind("microwave", p2);
// ProductImpl toasterLocateRegistry
// = new ProductImpl("Blackwell Toaster");
// String name = "toasterLocateRegistry";
// ProductImpl stub = (ProductImpl) UnicastRemoteObject.exportObject(toasterLocateRegistry, 0);
// Registry registry = LocateRegistry.getRegistry();
// registry.rebind(name, stub);
Naming.rebind("toaster", p1);
Naming.rebind("microwave", p2);
System.out.println
("Waiting for invocations from clients...");
}
catch(Exception e)
{ System.out.println("Error: " + e);
}
}
}