MBeanServerConnection.invoke永远挂起

时间:2012-06-04 21:28:25

标签: timeout jmx invoke hang mbeans

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

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

3 个答案:

答案 0 :(得分:3)

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

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

当我第一次回复时,我正在考虑这些东西,但我在移动设备上,我不能打字值得一试......

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

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

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

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

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

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

干杯。

答案 1 :(得分:1)

@Nicholas:上面的代码没有用。我的意思是请求在3000. ms之后没有超时.ms。

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);

答案 2 :(得分:0)

当我回答:How to set request timeout for JMX Connector时,RMI属性可以帮助您。所有属性都在Oracle文档站点上: http://docs.oracle.com/javase/7/docs/technotes/guides/rmi/sunrmiproperties.html

例如:-Dsun.rmi.transport.tcp.responseTimeout=60000是客户端tcp响应超时。还有连接超时和服务器端连接的属性。

我也不满意JMX / RMI / TCP堆栈如何隐藏来自较低级别协议的重要设置,并使其无法用于单个连接。