或者我必须将所有这些调用移动到单独的线程中,以便它们不会锁定UI并需要终止应用程序吗?
请查看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);
}
};
@ 尼古拉斯:以上代码无法工作,我是指请求在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堆栈如何隐藏低级协议的重要设置,并使其对单个连接不可用。
MBeanServerConnectionFactoryBean
开始时,是否可以做同样的事情,这将产生一个MBeanServerConnection
。 - Mihai Danila