【问题标题】:Java RMI timeouts (crashes)Java RMI 超时(崩溃)
【发布时间】:2011-02-13 16:30:29
【问题描述】:

我正在使用 RMI 用 Ja​​va 编写服务器/客户端程序。当服务器崩溃时,这不是问题,客户端会收到 RemoteException 并断开连接。

但是当客户端崩溃时我会遇到问题。我的服务器使用 Timer 不时 ping 所有客户端对象,当它没有连接到客户端时,它会捕获 RemoteException。

然后,它应该从服务器中删除客户端对象(只需从列表中删除它),但这是不可能的,因为当我尝试对代理客户端对象执行任何操作时,它会抛出另一个 RemoteException。我该如何解决这个问题?

List<User> users;
Map<User, IClient> clients;

    class PingClients extends TimerTask {
          public void run() {
              for (IClient client : clients.values())
                try {
                    client.ping();
                } catch (RemoteException e) {
                    //removeClient(client); GENERATES REMOTEEXCEPTION
                }
          }

     }

     public boolean removeClient(IClient c) throws RemoteException{
          User u = c.getUser();
          users.remove(u);
          clients.remove(u);

          for (IClient client : clients.values())
              client.updateUsers(users);
      }

【问题讨论】:

  • 请向我们展示您如何遍历客户端代理并将其从列表中删除。使用迭代器进行迭代,并使用它的 remove 方法从列表中删除当前代理不应抛出任何 RemoteException。
  • 您仍然没有向我们展示您是如何删除客户的。 removeClient 方法的内容是什么?

标签: java timeout rmi crash


【解决方案1】:

您得到一个 RemoteException 是因为当您尝试删除客户端(已断开连接)时,您首先调用客户端上的 getUser() 方法,这显然会引发 RemoteException。

你应该把你的代码改成这样:

  class PingClients extends TimerTask {
      public void run() {
          for (Iterator<Map.Entry<User, IClient>> it = clients.entrySet().iterator(); it.hasNext(); )
            Entry<User, IClient> entry = it.next();
            try {
                IClient client = entry.getValue();
                client.ping();
            } 
            catch (RemoteException e) {
                it.remove();
            }
      }
  }

确保一次只有一个线程可以访问地图。

【讨论】:

  • 这不会抛出并发修改异常吗?毕竟,这会在您迭代集合时修改集合。
【解决方案2】:

第一行,您应该使用 ConcurrentMap 而不是 Map。这将避免您因同时访问您的地图而产生的很多麻烦。

【讨论】:

    【解决方案3】:

    如果IClient c 是您的远程对象,那么如果客户端不可用,对其调用getUser() 显然会抛出异常。

    【讨论】:

      猜你喜欢
      • 2016-05-26
      • 2011-09-04
      • 2010-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多