MBeanServerConnection.invoke 永远挂起



我们有一个应用程序,它使用 MBeanServerConnection.invoke 在 MBean 上调用各种远程方法。有时,这些方法之一会挂起。有没有办法在通话中超时? 以便在调用时间过长时返回并出现异常?

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

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

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

当我第一次回复时,我在想这些东西,但我在我的手机上,我不能在上面打字......

这确实是一个 RMI 问题,除非您使用不同的协议,否则您无能为力,除了,正如您所说,将所有这些调用移动到单独的线程中,这样它们就不会锁定 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);
   }
};

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

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

干杯。

@ 尼古拉斯 :上面的代码不起作用。我的意思是请求在 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);

正如我回答的那样:如何为 JMX 连接器设置请求超时 RMI 属性可以为您提供帮助。所有属性都在 Oracle 文档站点上:http://docs.oracle.com/javase/7/docs/technotes/guides/rmi/sunrmiproperties.html。

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

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

相关内容

  • 没有找到相关文章

最新更新