我们实现了一个小应用程序,客户端在服务器上调用方法。我们的想法是服务器保留一个要调用的变量列表,一旦调用了值,我们就会对其进行条带化。
在我们的实例中,我们需要首先使用" 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));
}
}
}
我们有一个监视assertQueue的独立线程,但是没有观察到变化,而我们确信assertQueue已经被RMI改变了。
另一个线程继续打印
{c3=[m1, m2]}
在p1打印时:
{c3=[m2]}
另一个线程保持相同的打印,即使在p1点打印出较小的assertQueue之后也是如此。
答案 0 :(得分:1)
这里没有RMI。这是一个Serializable
对象,它被传输到客户端并在那里执行。这是问题所在。您拥有每个客户端的数据结构的副本,而不是服务器上的单个数据结构。
您已忘记将其导出。你需要:
UnicastRemoteObject()
,这会强制您提供引发RemoteException
或UnicastRemoteObject.exportObject(),
bind().
手动导出&#39;
醇>
您可以删除implements Serializable
。