MBeanServerConnection.invoke永远挂起

Cas*_*ato 5 timeout jmx mbeans invoke hang

我们有一个应用程序,它使用MBeanServerConnection.invoke在MBean上调用各种远程方法.偶尔会有其中一种方法挂起.有没有办法让电话超时?如果通话时间太长,它将返回异常?

或者我是否必须将所有这些调用移动到单独的线程中,以便它们不会锁定UI并要求杀死应用程序?

Nic*_*las 3

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

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

当我第一次回复时我正在考虑这个问题,但我在手机上,我根本无法打字......

这确实是一个 RMI 问题,除非您使用不同的协议,否则您无能为力,除非如您所说,将所有这些调用移至单独的线程中,这样它们就不会锁定 UI。

但是...如果您可以选择摆弄目标服务器并且可以自定义连接客户端,那么您至少有 1 个选项,即 在目标服务器上自定义JMXConnectorServer 。

标准 JMXConnectorServer 实现是RMIConnectorServer。其规范的一部分是,当您使用任何构造函数(例如RMIConnectorServer(JMXServiceURL url, Mapenvironment))创建新实例时,环境映射可以包含键/值对,其中键为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);
   }
};
Run Code Online (Sandbox Code Playgroud)

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

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

干杯。