Java RMI は、リモート メソッド呼び出しを指します。これは、ある Java 仮想マシン内のオブジェクトが別の Java 仮想マシン内のオブジェクトのメソッドを呼び出すことを可能にするメカニズムです。このメソッドで呼び出すことができるオブジェクトはすべて、リモート インターフェイスを実装する必要があります。 (推奨: java ビデオ チュートリアル )
Java RMI は新しいテクノロジではありません (Java 1.1 の時代に利用可能でした)が、非常に重要な基礎テクノロジです。
有名な EJB はすべて rmi に基づいていますが、オープン ソースのリモート呼び出しコンポーネントもいくつかあり、その基礎となるテクノロジも rmi です。
Web サービスと SOA が盛んに提唱されている時代に、すべてのアプリケーションが不器用な Web サービス コンポーネントを使用して実装する必要がありますか? 比較テストを行った結果、RMI が最も単純であり、小規模なアプリケーションでは RMI が最適です。
次は、RMI の原理とアプリケーションを説明するために簡単な例を使用します。次の例は単純な HelloWorld ですが、RMI のコア アプリケーションと開発モデルをカバーしています。
/** * Created by IntelliJ IDEA. * User: leizhimin * Date: 2008-8-7 21:50:02 * 定义一个远程接口,必须继承Remote接口,其中需要远程调用的方法必须抛出RemoteException异常 */ public interface IHello extends Remote { /** * 简单的返回“Hello World!"字样 * @return 返回“Hello World!"字样 * @throws java.rmi.RemoteException */ public String helloWorld() throws RemoteException; /** * 一个简单的业务方法,根据传入的人名返回相应的问候语 * @param someBodyName 人名 * @return 返回相应的问候语 * @throws java.rmi.RemoteException */ public String sayHelloToSomeBody(String someBodyName) throws RemoteException; }
/** * Created by IntelliJ IDEA. * User: leizhimin * Date: 2008-8-7 21:56:47 * 远程的接口的实现 */ public class HelloImpl extends UnicastRemoteObject implements IHello { /** * 因为UnicastRemoteObject的构造方法抛出了RemoteException异常,因此这里默认的构造方法必须写,必须声明抛出RemoteException异常 * * @throws RemoteException */ public HelloImpl() throws RemoteException { } /** * 简单的返回“Hello World!"字样 * * @return 返回“Hello World!"字样 * @throws java.rmi.RemoteException */ public String helloWorld() throws RemoteException { return "Hello World!"; } /** * 一个简单的业务方法,根据传入的人名返回相应的问候语 * * @param someBodyName 人名 * @return 返回相应的问候语 * @throws java.rmi.RemoteException */ public String sayHelloToSomeBody(String someBodyName) throws RemoteException { return "你好," + someBodyName + "!"; } }
/** * Created by IntelliJ IDEA. * User: leizhimin * Date: 2008-8-7 22:03:35 * 创建RMI注册表,启动RMI服务,并将远程对象注册到RMI注册表中。 */ public class HelloServer { public static void main(String args[]) { try { //创建一个远程对象 IHello rhello = new HelloImpl(); //本地主机上的远程对象注册表Registry的实例,并指定端口为8888,这一步必不可少(Java默认端口是1099),必不可缺的一步,缺少注册表创建,则无法绑定对象到远程注册表上 LocateRegistry.createRegistry(8888); //把远程对象注册到RMI注册服务器上,并命名为RHello //绑定的URL标准格式为:rmi://host:port/name(其中协议名可以省略,下面两种写法都是正确的) Naming.bind("rmi://localhost:8888/RHello",rhello); // Naming.bind("//localhost:8888/RHello",rhello); System.out.println(">>>>>INFO:远程IHello对象绑定成功!"); } catch (RemoteException e) { System.out.println("创建远程对象发生异常!"); e.printStackTrace(); } catch (AlreadyBoundException e) { System.out.println("发生重复绑定对象异常!"); e.printStackTrace(); } catch (MalformedURLException e) { System.out.println("发生URL畸形异常!"); e.printStackTrace(); } } }
/** * Created by IntelliJ IDEA. * User: leizhimin * Date: 2008-8-7 22:21:07 * 客户端测试,在客户端调用远程对象上的远程方法,并返回结果。 */ public class HelloClient { public static void main(String args[]){ try { //在RMI服务注册表中查找名称为RHello的对象,并调用其上的方法 IHello rhello =(IHello) Naming.lookup("rmi://localhost:8888/RHello"); System.out.println(rhello.helloWorld()); System.out.println(rhello.sayHelloToSomeBody("熔岩")); } catch (NotBoundException e) { e.printStackTrace(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (RemoteException e) { e.printStackTrace(); } } }
RMI サーバー プログラムを実行します:
RMI クライアント プログラムを実行します:
概要:
上記のプロセスから、RMI はサーバーの IP アドレスとポートに大きく依存します。ただし、開発中は将来のサーバー IP とポートがどのようになるかはわかりませんが、クライアント プログラムは依存します。この IP とポート上で。
これは RMI の制限の 1 つでもあります。この問題を解決するには 2 つの方法があります。1 つは DNS を通じて解決する方法、もう 1 つはカプセル化によって IP をプログラム コードの外に公開する方法です。
RMI の 2 番目の制限は、RMI が Java 言語でのリモート呼び出しであることです。両端のプログラミング言語は Java で実装する必要があります。異なる言語間の通信には、Web サービスまたは共通オブジェクト リクエストの使用を検討できます。代理店 (CORBA) を実現します。
Java についてさらに詳しく知りたい場合は、Java 基本チュートリアル 列に注目してください。
以上がJava RMI の概要 (例付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。