MBeanServerConnection.invoke永远挂起

5
我们有一个应用程序,使用MBeanServerConnection.invoke调用各种远程方法。偶尔会出现其中一个方法挂起的情况。是否有办法在调用时设置超时时间?如果调用时间过长,它将返回异常吗?
或者我必须将所有这些调用移动到单独的线程中,以便它们不会锁定UI并需要终止应用程序吗?
3个回答

3

请查看http://weblogs.java.net/blog/emcmanus/archive/2007/05/making_a_jmx_co.html

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

我在第一次回答时就考虑到了这个问题,但是当时我在手机上,打字很糟糕......

这实际上是一个RMI问题,除非您使用不同的协议,否则您无法做太多事情,除非像您说的那样,将所有这些调用移动到单独的线程中,以便它们不会锁定用户界面。

但是.... 如果您有机会修改目标服务器并且可以自定义连接客户端,则至少有一种选择,即自定义目标服务器上的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,然后使用setSoTimeout设置其SO_TIMEOUT,因此当客户端使用此套接字连接时,所有操作,包括连接,都会在3000毫秒后超时。
您还可以在OpenDMK的jmx-optional软件包中检查JMXMP连接器和服务器。(链接指向我的github mavenized)。没有内置的解决方案,但它们非常容易扩展,而且JMXMP是基于简单的TCP套接字,而不是RMI,所以这种类型的定制将是微不足道的。
干杯。

似乎归结为“将工作移动到您可以终止/忽略的线程”。 - CasaDelGato
谢谢,看起来很有帮助。 - CasaDelGato
我想知道当我们使用Spring的MBeanServerConnectionFactoryBean开始时,是否可以做同样的事情,这将产生一个MBeanServerConnection - Mihai Danila
1
当然。您需要在类路径中拥有 jmx-optional.jar,然后简单地使用 JMXMP ServiceURL,例如 service:jmx:jmxmp://yourhost:port - Nicholas

1

@ 尼古拉斯:以上代码无法工作,我是指请求在3000毫秒后未超时。

map.put(RMIConnectorServer.RMI_CLIENT_SOCKET_FACTORY_ATTRIBUTE, new RMIClientSocketFactory() {

            @Override
            public Socket createSocket(String host, int port) throws IOException {
                if(logger.isInfoEnabled() ){
                    logger.info("JMXManager inside createSocket..." + host + ": port :" + port);
                    }
                  Socket s = new Socket(host, port);
                  s.setSoTimeout(3000);
                  return s;
            }
        });

        cs = JMXConnectorServerFactory.newJMXConnectorServer(url,map,mbeanServer);

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接