【问题标题】:Java RMI timeout in callback回调中的 Java RMI 超时
【发布时间】:2010-04-09 14:25:45
【问题描述】:

我们使用 Java RMI 进行通信。 RMI 客户端将处理请求和带有回调方法的对象传递给 RMI 服务器。服务器在处理完成后调用回调。设置类似于RMI Callbacks 中描述的设置。

调用回调方法时,有时我们会在服务器中收到“读取超时”异常。在引发异常之前,回调线程会暂停大约一分钟。

java.rmi.ConnectIOException: error during JRMP connection establishment; nested exception is: 
    java.net.SocketTimeoutException: Read timed out
    at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:286)
    at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:184)
    at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:110)
    at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:178)
    at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:132)
    at $Proxy2.finished(Unknown Source)
    at com.unrisk.db.grid.GridTask.invokeCallback(com.unrisk.db.grid.GridTask:1292)
    at com.unrisk.db.grid.GridTask.invokeCallbacks(com.unrisk.db.grid.GridTask:1304)
    at com.unrisk.db.service.tasks.EquityMDTask.afterRun(com.unrisk.db.service.tasks.EquityMDTask:276)
    at com.unrisk.db.grid.GridTask.run(com.unrisk.db.grid.GridTask:720)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:619)
Caused by: java.net.SocketTimeoutException: Read timed out
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.read(SocketInputStream.java:129)
    at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
    at java.io.BufferedInputStream.read(BufferedInputStream.java:237)
    at java.io.DataInputStream.readByte(DataInputStream.java:248)
    at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:228)
    ... 12 more

我们在 Windows Server 2003 32 位下使用 Sun Java JDK 1.6.0_18。

是否可以通过调整 RMI 相关的系统属性来解决连接问题?

【问题讨论】:

    标签: java callback rmi


    【解决方案1】:

    这个值得收藏的帖子中描述了很多超时: http://archives.java.sun.com/cgi-bin/wa?A2=ind0208&L=jini-users&P=R27617

    在我使用 JRMP 的(有限)经验中,我发现我必须使用 JVM 全局属性来调整读取超时...

    题外话: 我的团队现在专门使用 Jeri(Java 可扩展远程调用),它是 Apache River(以前:Sun Jini)项目的一部分。 Jeri 比 JRMP 更易于配置,允许您定义自己的底层协议。

    【讨论】:

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