简单的RMI回调示例

时间:2012-05-03 18:38:31

标签: java callback rmi

有人可以提供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();
        }
    }
}

1 个答案:

答案 0 :(得分:15)

我不是RMI的专家,但我可以告诉你,你可以从“David and Michael Reilley”中搜索“Java网络编程和分布式计算”这本书。您将能够找到从第278页开始的RMI CALLBACK实现的一个很好的示例!

作者定义了理解它的一种好方法,所以我觉得复制/粘贴比尝试制作我自己的更好,这就是:

  • “理解回拨的最简单方法是考虑打电话。假设您想知道股票价格是否达到某个水平,并且您要求您的经纪人回拨它时。当经纪人(事件的来源)注意到股票价格反映了您的参数,他或她给您回电,通知您新的价格。这是一个回调。“

在默认实现中,RMI只允许CLIENT与SERVER之间的通信,请求服务器主机中的远程服务(远程对象)的操作。您可以使用回调方法,而不是让您的服务器与您的客户端通话!

Thast很棒!想象一下,如果你有一台服务器,你想要检查它是否在线(或者如果没有掉线/关机)给客户带来了!你必须要求连续使用一个远程对象,它应该返回一些布尔值(例如)告诉你实际上是在线的。

那太可怕了!因为你会丢失一些网络带宽,再次在服务器上再次请求,并再次......在其上引起一些连接池!

在这些情况下,使用CALLBACK确实应该是有用的; - )

我希望你能理解我的答案,了解回调是什么/做什么。

致以最诚挚的问候,