gpt4 book ai didi

java - 哪些 RMI 异常表明连接丢失

转载 作者:太空宇宙 更新时间:2023-11-04 08:33:50 27 4
gpt4 key购买 nike

我正在使用以下代码来通知远程 (RMI) 事件监听器发生更改。

        // notify remote listeners of this change
ThreadPool.execute(new Runnable() { @Override public void run() {

List<Integer> removal = new ArrayList<Integer>();

listeners.getReadLock().lock();
try {

for (Entry<Integer, RemoteDataServerListener> e : listeners.entrySet()) {

try {
e.getValue().creditsChanged(player.getId(), player.getCredits());
} catch (RemoteException er) {

log.warn("Error in remote listener", er);

// this listener is gone
if (er instanceof NoSuchObjectException) {
log.info("Removing the listener");
removal.add(e.getKey());
}

}

}

} finally {
listeners.getReadLock().unlock();
}

// listeners that are gone don't need future events
listeners.removeAll(removal);


}});

正如您所看到的,当监听器抛出 NoSuchObjectException 时,我会删除它,但这可能不是唯一可以抛出的异常。是否有指示远程对象(或整个服务器)丢失/断开连接的 RMI 异常的完整列表?

最佳答案

这是一个复杂的问题。它们中的大多数根本不指示丢失的连接,事实上只有 UnmarshalException 确实这样做,而且只是有时,例如当它包装 ClassNotFoundException 时,它并不表示连接丢失。

从某种意义上说,ConnectIOException 也表明了这一点,但它仅在调用开始时尝试恢复池客户端连接时才会发生。

一个更有趣、更复杂的问题是,如果您在异常之后重试,哪些异常会保持幂等性,这是一个非常难以回答的问题。我在 RMI 书中用了大约 20 页的篇幅来讨论这个问题,但我怀疑我是否涵盖了所有可能性。

NoSuchObjectException 表示导出您正在调用的 stub 的远程对象不再存在,即已从其 JVM 中取消导出。

RemoteException 本身几乎可以意味着任何内容,特别是如果您错误地让自己的应用程序异常扩展它。不要那样做。而且在实践中你不应该仅仅捕获RemoteException本身,你应该使用底部的一个catch-all RemoteException捕获器单独捕获所有可能的RMI异常,因为不同的异常有不同的恢复策略。除非您只是想完全放弃任何远程错误。

关于java - 哪些 RMI 异常表明连接丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6845982/

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