我的 RMI 调用定义为:

public void remoteGetCustomerNameNumbers(ArrayList<String> customerNumberList, ArrayList<String> customerNameList) throws java.rmi.RemoteException;

该函数执行数据库查找并填充两个 ArrayList。调用函数什么也得不到。我相信这适用于向量类型。

我是否需要使用 Vector,或者有没有办法让它在不进行两次调用的情况下工作。我还有一些可能会使用的其他想法,例如返回键/值对,但我想知道是否可以让它发挥作用。

更新:
如果可以的话,我会接受迄今为止给出的所有答案。我不知道网络成本,因此重新设计函数以返回 LinkedHashMap 而不是两个 ArrayList 是有意义的。

有帮助吗?

解决方案

正如汤姆提到的,您可以传递远程对象。您必须创建一个类来保存实现远程的列表。每当您传递实现 Remote 作为参数的东西时,每当接收方使用它时,它都会转身并进行远程调用 后退 给调用者使用该对象。

其他提示

RMI 中的参数调用序列化。服务器上的反序列化会创建列表的副本。如果列表保留在客户端,那么网络调用的数量将会相当高。您可以传递远程对象,但要注意性能影响。

当您进行远程调用时,您会丢失参考资料。您需要返回列表,而不是期望它们由远程调用填充。

正如其他人已经提到的,当将对象作为参数传递给 RMI 方法时,该对象将被序列化,然后在包含 RMI 方法的目标对象内的另一端进行反序列化。这会破坏传入的原始对象的引用,因为您现在有两个不同的对象:一个在调用该方法的客户端代码中,一个在远程端。

在这个特定的示例中,更好的方法是分解方法调用(因为您似乎在一个方法中做了两件事:获取客户名称并获取客户编号),并将结果返回给调用者,而不是传递集合...如下所示:

public ArrayList<String> getCustomerNames() throws java.rmi.RemoteException;

public ArrayList<String> getCustomerNumbers() throws java.rmi.RemoteException;

由于 ArrayList 和 String 都实现了可序列化,因此集合中的结果将被序列化并通过线路发送到调用该方法的客户端代码,此时您可以根据需要使用数据。相反,如果您需要在集合中使用自定义对象,只要您的类实现 java.io.Serialized 接口,并遵循该接口的规范,您应该不会有任何问题。

这将导致通过线路进行两次单独的调用,但交互更加干净和简单,并且避免了原始示例中的引用破坏问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top