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

时间:2015-02-19 21:28:49

标签: java rmi

我们实现了一个小应用程序,客户端在服务器上调用方法。我们的想法是服务器保留一个要调用的变量列表,一旦调用了值,我们就会对其进行条带化。

在我们的实例中,我们需要首先使用" 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之后也是如此。

1 个答案:

答案 0 :(得分:1)

这里没有RMI。这是一个Serializable对象,它被传输到客户端并在那里执行。这是问题所在。您拥有每个客户端的数据结构的副本,而不是服务器上的单个数据结构。

您已忘记将其导出。你需要:

  1. 扩展UnicastRemoteObject(),这会强制您提供引发RemoteException
  2. 的构造函数
  3. 在致电UnicastRemoteObject.exportObject(),
  4. 之前,使用bind().手动导出&#39;

    您可以删除implements Serializable