gpt4 book ai didi

Java RMI 在同一实例中具有不同的值

转载 作者:行者123 更新时间:2023-12-01 11:53:27 25 4
gpt4 key购买 nike

我们实现了一个小应用程序,客户端可以调用服务器上的方法。这个想法是服务器保留要调用的变量列表,一旦调用它,我们就将其删除。

在我们的实例中,我们需要让客户端首先使用“m1”进行调用,然后使用“m2”进行调用。 justReceived 方法(通过 RMI)。

public class Server implements TestService, Serializable {
private HashMap<String, List<String>> assertQueue = new HashMap<String, List<String>>();

@Override
public synchronized void justReceived(Message m, String from, String to) {
if (!assertQueue.containsKey(to) || !(m instanceof TestMessage))
return;

TestMessage message = (TestMessage) m;

if (assertQueue.get(to).get(0).equals(message.message)) {
assertQueue.get(to).remove(0);
System.out.println(assertQueue);//p1
} else {
testErrors.add(new AssertionError("Expected " + to + " to receive message " + assertQueue.get(to).get(0) + " but got " + message.message));
}
}
}

我们有一个单独的线程监视断言队列,但没有观察到任何变化,但我们确信断言队列已通过 RMI 进行了更改。

另一个线程继续打印

{c3=[m1, m2]}

在 p1 时打印:

{c3=[m2]}

即使在 p1 点打印了较小的断言队列后,另一个线程仍保持相同的打印。

最佳答案

这里没有 RMI。这是一个可序列化的对象,它被传输到客户端并在那里执行。这就是问题所在。每个客户端都有一份数据结构副本,而不是服务器上的一份数据结构。

您忘记导出它。您需要:

  1. 让它扩展 UnicastRemoteObject(),这反过来会强制您提供一个抛出 RemoteException 的构造函数,或者
  2. 在调用 bind() 之前,使用 UnicastRemoteObject.exportObject()“手动”导出它。

您可以删除实现可序列化

关于Java RMI 在同一实例中具有不同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28617269/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com