今天Test RMI(通过spring), result 返回的是一个对象, 想问一下, 怎么想才能返回一个对象的引用, 这样就可以反复去check 远程端是否有处理完. 谢谢啦.
public static void main(String[] args) throws InterruptedException {
out.println("Client Begin!");
ApplicationContext ctx = new ClassPathXmlApplicationContext("ClientConfig.xml");
CypherService service = (CypherService) ctx.getBean("clientInvoke");
try {
[b]Result result = service.encrypt("plain");[/b]
System.out.println(result.getResult());
do{
Thread.sleep(1000);
System.out.println(result.getResult());
} while (!result.isProcessed());
} catch (RemoteException e) {
e.printStackTrace();
}
out.println("Client End!");
}
问题补充:z276356445t 写道
这是不行的,本身RMI就是将处理完成的结果返回给客户端,一次请求一次响应.
问题解决了.
要点:
1. Result extends Remote
2. ResultImpl extends UnicastRemoteObject implements Result
这里使用了spring, UnicastRemoteObject 是 implements Serializable的. 实质是ResultImpl只要implements Serializable, Result 就可以了.
如果Result implements Serializable, 那么传回到client的就是一个Object,
如果Result extends Remote, 那么传回到client的就是一个引用(RMI自动识别).
当然ResultImpl 必须要implements Serializable, 否则不可以持久化, 也就不能传输.
然后我们就可以在client端不停地检查Server 端的Result 是否执行完.
问题补充:z276356445t 写道
服务器端的对象与客户端的对象都不属于同一虚拟机中的对象,何来引用?
http://buralin.iteye.com/admin/blogs/1389172
我上传了一个sample.
相关推荐
- **性能优化**:RMI提供了优化选项,如缓存远程对象引用,减少网络通信次数,以及调整传输协议参数来提升性能。 - **故障恢复**:RMI系统设计时应考虑服务器崩溃或网络中断的情况,实现适当的恢复策略。 总的来说...
4. **获取远程对象引用**:客户端通过Registry.lookup方法获取远程对象的引用。 5. **调用远程方法**:客户端使用获取的引用调用远程方法。 6. **处理异常**:由于网络通信的不确定性,客户端和服务器端都需要捕获...
客户端需要获取远程对象的引用,这通常通过查找RMI注册表完成: ```java Registry registry = LocateRegistry.getRegistry("localhost", 1099); MyRemoteInterface remote = (MyRemoteInterface) registry.lookup(...
- **获取远程对象引用**:客户端通过`lookup()`方法从注册表中获取远程对象的引用。 - **调用远程方法**:有了引用,客户端就可以像操作本地对象一样调用远程对象的方法。 3. **RMI生命周期**: - **启动RMI...
- 通过远程对象引用调用远程方法。 RMI的源码分析可以帮助我们理解其内部工作原理,例如,如何自动生成stub和skeleton,以及它们是如何处理网络通信的。而RMI工具则可以帮助我们更方便地调试和管理RMI应用,如...
2. `java.rmi.server.UnicastRemoteObject`:用于创建远程对象的基类,它可以导出一个远程对象以便进行RMI通信。 3. `java.rmi.registry.Registry`:代表RMI注册表,提供了查找、绑定和解绑远程对象的方法。 4. `...
客户端代码主要负责获取远程对象的引用,并调用远程对象的方法。 ### 服务器回调 除了基本的远程方法调用外,RMI还支持服务器端主动向客户端发送消息的能力,这被称为服务器回调。实现服务器回调需要客户端提供一...
客户端通过RMI注册表获取远程对象的引用,然后就可以像调用本地对象一样调用远程方法了。 ```java public class RMIClient { public static void main(String[] args) { try { Registry registry = ...
4. **获取远程对象引用**:在客户端,使用`java.rmi.Naming`类的`lookup()`方法根据服务名从注册表中查找并获取远程对象的引用。 5. **调用远程方法**:现在,客户端可以通过这个引用来调用远程对象的方法,就像...
4. RMIClient:客户端程序,通过RMI注册表获取远程对象引用,然后调用远程方法。 二、RMI的工作流程 1. 客户端创建一个远程接口的引用,通过` LocateRegistry.getRegistry()` 获取RMI注册表,并使用`Registry....
1. **RMI概念**:RMI是一种基于对象的远程调用机制,它允许Java对象像调用本地方法一样调用远程对象的方法。RMI系统包括客户端和服务器两部分,客户端通过接口与服务器交互,服务器则提供具体实现。 2. **RMI架构**...
`java.rmi.Naming`则用来绑定或查找远程对象引用。 #### 序列化与线程管理 在Java RMI中,序列化是非常重要的一个环节。序列化机制确保了对象可以在网络上传输,并能在远程端正确还原。本书详细介绍了如何处理复杂...
`java.rmi.Naming.lookup()`方法用于查找远程对象的引用。 5. **处理异常**:由于网络通信的不可靠性,必须妥善处理`RemoteException`和其他可能的网络相关异常。 Java RMI的实现基于Java的序列化机制,这意味着...
Java RMI允许这些对象的引用在不同进程中传递,使得客户端可以调用远程对象的方法。 3. **注册表(Registry)**:RMI注册表是一个服务,它提供了查找远程对象的简单方式。客户端通过向注册表查询获取远程对象的引用...
JNDI主要用于Java应用中的命名和目录服务,它可以与RMI结合使用来查找和绑定远程对象: 1. **创建JNDI上下文**:在服务器端,使用`InitialContext`创建JNDI上下文并绑定远程对象。 2. **查找远程对象**:在客户端,...
远程对象的句柄标识了该对象的位置以及如何通过RMI远程接触它。当在本地使用时,它就像任何其他对象一样工作。当作为参数传递时,其句柄也会被传递(类似于普通的Java对象)。 2. **可序列化对象(Serializable ...
6. **获取远程对象引用**:在客户端,使用`java.rmi.Naming.lookup()`方法根据名称从RMI注册表获取远程对象的引用。 7. **调用远程方法**:通过获取的引用,客户端可以直接调用`sayHello()`方法,就像调用本地对象...
当需要创建一个远程对象时,程序员会定义一个继承自`java.rmi.Remote`的接口,并在其中声明需要远程调用的方法。这些方法通常会抛出`java.rmi.RemoteException`,因为网络通信可能会出现异常。远程接口的所有方法都...
3. **注册表(Registry)**:类似于服务目录,用于存储远程对象的引用,使得客户端可以通过名称查找并连接到远程对象。`java.rmi.registry.Registry`是RMI提供的标准注册表实现。 4. ** Stub 和 Skeleton**:Stub是...