RMI远程回调

RMI远程回调, java6测试通过:
1. 定义接口ISomeCallback
2. 服务端RMI服务接口接受ISomeCallback作为参数
3. 客户端实现SomeCallback extends UnicastRemoteObject implements ISomeCallback。
4. 客户端调用服务端RMI服务,SomeCallback作为参数。服务端收到后回调callback.onSomeThingHappened()

注意
1. 回调不是用来传递一次性可以返回复杂结果,这样没效率
2. 回调不是用来传递可以确定立即返回的结果,可以用来返回阶段性进度等
3. 回调不要过多,而且不确定结束时间。要保证回调对象会被释放
4. 如果RMI走的http,proxy之类的,可能会有问题
5. 不要用回调替代消息
实现客户回调的原理需要使用Java中的RMI(Remote Method Invocation)远程方法调用机制。下面是实现步骤: 1. 客户在远程回调服务器上注册自己,以便服务器可以在所等待事件发生时,向客户发起远程方法调用的一个特征。这个过程可以通过客户端向服务器端暴露一个回调接口来完成,服务器可以在该接口上调用客户端的方法。 2. 在远程方法调用高级应用中需要两组代理,一组代理是服务器远程接口所需的(用于客户调用远程方法),另一组是客户远程接口所需的(用于服务器回调)。这里需要使用Java中的Stub和Skeleton,Stub是客户端使用的代理,Skeleton则是服务器端使用的代理。 下面是Java代码实现: 服务端: ```java import java.rmi.RemoteException; import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; import java.rmi.server.UnicastRemoteObject; public class CallbackServerImpl extends UnicastRemoteObject implements CallbackServer { private static final long serialVersionUID = 1L; protected CallbackServerImpl() throws RemoteException { super(); } @Override public void registerForCallback(CallbackClient callbackClient) throws RemoteException { System.out.println("Client registered for callback."); //调用客户端注册的回调函数 callbackClient.notifyClient(); } public static void main(String[] args) { try { Registry registry = LocateRegistry.createRegistry(1099); CallbackServerImpl server = new CallbackServerImpl(); registry.rebind("CallbackServer", server); System.out.println("Server started."); } catch (Exception e) { e.printStackTrace(); } } } ``` 客户端: ```java import java.rmi.Remote; import java.rmi.RemoteException; public interface CallbackClient extends Remote { void notifyClient() throws RemoteException; } ``` ```java import java.rmi.RemoteException; import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; import java.rmi.server.UnicastRemoteObject; public class CallbackClientImpl extends UnicastRemoteObject implements CallbackClient { private static final long serialVersionUID = 1L; protected CallbackClientImpl() throws RemoteException { super(); } @Override public void notifyClient() throws RemoteException { System.out.println("Callback received."); } public static void main(String[] args) { try { Registry registry = LocateRegistry.getRegistry("localhost", 1099); CallbackServer server = (CallbackServer) registry.lookup("CallbackServer"); CallbackClientImpl client = new CallbackClientImpl(); //客户端注册回调函数 server.registerForCallback(client); System.out.println("Callback registered."); } catch (Exception e) { e.printStackTrace(); } } } ``` 在这个例子中,客户端向服务器端暴露了一个回调接口CallbackClient,服务器在该接口上调用客户端的notifyClient方法。客户端通过调用回调函数registerForCallback注册自己,服务器在需要时调用该回调函数。最后,运行客户端和服务器端的代码,即可实现远程回调
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值