我们有一个应用程序,该应用程序使用MBeanServerConnection.invoke在MBean上调用各种远程方法。
有时这些方法之一挂起。
有什么办法可以让通话超时吗?这样,如果通话时间太长,它将异常返回?

还是我必须将所有这些调用移到单独的线程中,以便它们不会锁定UI并要求终止该应用程序?

最佳答案

参见http://weblogs.java.net/blog/emcmanus/archive/2007/05/making_a_jmx_co.html

=====更新=====

第一次回复时,我就在想这些东西,但是我在手机上,无法打字。

这确实是一个RMI问题,除非您使用其他协议(protocol),否则您将无能为力,除了您所说的那样,将所有这些调用移到单独的线程中以免它们锁定UI。

但是.....如果您可以选择与目标服务器打交道,并且可以自定义连接客户端,则至少有一个选项可以自定义目标服务器上的JMXConnectorServer

标准的JMXConnectorServer实现是RMIConnectorServer。规范的一部分是,当您使用任何构造函数(例如RMIConnectorServer(JMXServiceURL url, Map environment))创建新实例时,环境映射可以包含一个键/值对,其中键为RMIConnectorServer.RMI_CLIENT_SOCKET_FACTORY_ATTRIBUTE且值为RMIClientSocketFactory。因此,您可以指定一个套接字工厂方法,如下所示:

RMIClientSocketFactory clientSocketFatory = new RMIClientSocketFactory() {
   public Socket createSocket(String host, int port) {
      Socket s = new Socket(host, port);
      s.setSoTimeout(3000);
   }
};

该工厂创建Socket,然后使用SO_TIMEOUT设置其setSoTimeout,因此,当客户端使用此套接字连接时,所有操作(包括连接)将在3000毫秒后超时。

您还可以在JMXMP的jmx-optional包中 check out OpenDMK连接器和服务器。 (链接是我的github Mavenized)。请注意,没有内置的解决方案,但是它们非常易于扩展,并且JMXMP是基于TCP套接字而不是RMI的简单套接字,因此这种类型的自定义将是微不足道的。

干杯。

10-04 17:27