6

Hello World の簡単な RMI コールバックの例を教えてください。私はそれを研究しようとしていますが、理解できるものを見つけることができないようです。コールバックとは/何をするのか理解できません。

これが役立つ場合、これは私の現在のHello World RMIです...

インターフェース

package example.hello;

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface Hello extends Remote {
    String sayHello() throws RemoteException;
}

クライアント

package example.hello;

import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

public class Client {

    private Client(){}

    public static void main(String[] args){

        String host = (args.length < 1) ? null : args[0];

        try{
            Registry registry = LocateRegistry.getRegistry(host);
            Hello stub = (Hello) registry.lookup("Hello");
            String response = stub.sayHello();
            System.out.println("response: " + response);
        } catch (Exception e) {
            System.err.println("Client exception: " + e.toString());
            e.printStackTrace();
        }
    }

}

サーバ

package example.hello;

import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;

public class Server implements Hello {

    public Server(){}

    @Override
    public String sayHello() {
        System.out.println("responded!");
        return "Hello, world!";
    }

    public static void main(String[] args) {

        try{
            Server obj = new Server();
            Hello stub = (Hello) UnicastRemoteObject.exportObject(obj, 0);

            // Bind the remote object's stub in the registry
            Registry registry = LocateRegistry.getRegistry();
            registry.bind("Hello", stub);

            System.err.println("Server ready");
        } catch (Exception e) {
            System.err.println("Server exception: " + e.toString());
            e.printStackTrace();
        }
    }
}
4

1 に答える 1

17

私は RMI の専門家ではありませんが、"David and Michael Reilley" の "Java Network Programming and Distributed Computing" という本を検索できることは確かです。278 ページから始まる RMI CALLBACK 実装の優れた例を見つけることができます。

著者はそれを理解するための良い方法を定義しているので、自分で作成するよりもコピー/貼り付けする方がよいと思いました。

  • 「コールバックを理解する最も簡単な方法は、電話を考えることです。株価が特定のレベルに達したかどうかを知りたいと仮定し、ブローカーに電話をかけ直すように依頼します。ブローカー(のソース)イベント) は、株価があなたのパラメータを反映していることに気づき、新しい価格を通知するためにあなたに電話をかけ直します。それがコールバックです。"

デフォルトの実装では、RMI は CLIENT から SERVER への通信のみを許可し、サーバー ホスト内のリモート サービス (リモート オブジェクト) のアクションを要求します。サーバーがクライアントと通信するようにするよりも、コールバック メソッドを使用できます。

それは素晴らしいです!1 つのサーバーがあり、それがオンラインであるかどうか (またはドロップ/シャットダウンしていないかどうか) をクライアントから確認したい場合を想像してみてください。実際にオンラインであることを示すブール値(たとえば)を返すリモートオブジェクトの継続的な使用を要求する必要があります。

それは恐ろしいでしょう!ネットワーク帯域幅がいくらか失われるため、サーバーでリクエストを何度も何度も何度も...接続プールが発生します。

これらの場合、CALLBACKを使用すると便利です;-)

コールバックとは/行うことについて、私の回答で少し理解していただければ幸いです。

よろしくお願いします、

于 2012-09-05T19:26:05.420 に答える