2011-03-14 84 views
0

我有一个Java RMI系统。情况很典型:客户端调用服务器的一个方法。 客户端有一个内部计时器,所以如果服务器没有按时完成(时间在客户端指定),那么客户端必须做其他事情。Java RMI:在客户端代码中实现超时

因此,客户端必须等待服务器在特定的时间内完成其工作,并在服务器未完成时执行其他操作(无关紧要)。 How can I do this?

我不在乎连接超时等等,假设服务器和客户端通过RMI连接,一切都很好,只是服务器的工作可能是计算密集型的,可能需要一些时间。

非常感谢!

+0

你可能想看看这个:http://stackoverflow.com/questions/5140679/is-it-possible-to-interrupt-a-java-rmi-call/5140805 – 2011-03-14 18:22:02

回答

2

在另一个线程上进行RMI调用。让原始线程等待一段时间,以等待来自RMI调用线程的响应。

或者,让服务器RMI线程将任务委托给工作线程。如果工作线程没有足够快地响应,则返回调用者。

1

通常,当您希望操作在Java中超时时,您正在谈论一个或两个同步/异步转换层。我从来没有用RMI做过这件事,但我想你会做类似的事情。也许问这个讨论的参与者:(Asynchronous Java RMI)将会很有用。基于在(Spring Async RMI Call)提出的观点,我会说,你需要做到以下几点:

  1. 呼叫使用单独的线程(S)RMI服务;考虑使用执行者服务。
  2. 用一个包装器揭示这个问题,该包装器调用执行器服务并阻塞有限的结果时间;考虑使用期货。
0

您需要在每个客户端JVM上设置名为(我认为)的未记录属性sun.rmi.transport.tcp.responseTimeout。以毫秒为单位的值。