我们有一个应用程序,它使用MBeanServerConnection.invoke调用MBean上的各种远程方法。 偶尔会有这些方法之一挂起。 有没有什么办法让通话超时?所以如果通话时间过长,它会返回一个异常。MBeanServerConnection.invoke永远挂起
或者我是否必须将所有这些调用转移到单独的线程中,以便它们不锁定用户界面并要求终止应用程序?
我们有一个应用程序,它使用MBeanServerConnection.invoke调用MBean上的各种远程方法。 偶尔会有这些方法之一挂起。 有没有什么办法让通话超时?所以如果通话时间过长,它会返回一个异常。MBeanServerConnection.invoke永远挂起
或者我是否必须将所有这些调用转移到单独的线程中,以便它们不锁定用户界面并要求终止应用程序?
见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的简单套件,因此这种类型的定制将变得微不足道。
干杯。
@ 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);
正如我回答了: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堆栈如何从较低级别的协议隐藏重要设置,并使其不可用于单个连接。
似乎归结为“将工作转移到可以杀死/忽略的线程”。 – CasaDelGato
查看更新的答案。 – Nicholas
谢谢,这看起来很有帮助。 – CasaDelGato