2012-06-04 93 views
4

我们有一个应用程序,它使用MBeanServerConnection.invoke调用MBean上的各种远程方法。 偶尔会有这些方法之一挂起。 有没有什么办法让通话超时?所以如果通话时间过长,它会返回一个异常。MBeanServerConnection.invoke永远挂起

或者我是否必须将所有这些调用转移到单独的线程中,以便它们不锁定用户界面并要求终止应用程序?

回答

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 ms后超时。

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

干杯。

+0

似乎归结为“将工作转移到可以杀死/忽略的线程”。 – CasaDelGato

+0

查看更新的答案。 – Nicholas

+0

谢谢,这看起来很有帮助。 – CasaDelGato

1

@ Nicholas:上面的代码不工作。我的意思是请求没有超过3000.ms后超时。

map.put(RMIConnectorServer.RMI_CLIENT_SOCKET_FACTORY_ATTRIBUTE,新的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

正如我回答了: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堆栈如何从较低级别的协议隐藏重要设置,并使其不可用于单个连接。