timeout - MBeanServerConnection.invoke 永远挂起

标签 timeout jmx invoke freeze mbeans

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

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

最佳答案

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

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

当我第一次回复时,我正在考虑这个问题,但我在手机上,我根本无法打字......

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

但是....如果您可以选择摆弄目标服务器并且可以自定义连接客户端,那么您至少有1个选项,即自定义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然后设置其 SO_TIMEOUT使用setSoTimeout ,因此当客户端使用此套接字连接时,所有操作(包括连接)将在 3000 毫秒后超时。

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

干杯。

关于timeout - MBeanServerConnection.invoke 永远挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10888625/

相关文章:

c# - Lambda 表达式和 InvokeOperation

asp.net - ASP.NET 中的 session 超时

java - 无法激活 CXF ResponseTimeFeature

Logstash 引发意外错误 : <ArgumentError: Setting "" hasn't been registered>,

java - Tomcat 监控 - connectionCount JMX mbean

C# 无法从 'System.DateTime' 转换为 'object[]' methodinfo.invoke

设备上的 Android 错误 : Failed to install *. apk *:超时

Python:MySQL:处理超时

visual-studio - 00 :15:00 minutes because of Testimpact 之后的构建超时

java - 从 sts/eclipse 中调用不同语言的编译器