2010-09-27 50 views
3

我正在使用getMBeanServerConnection()方法打开JMX连接,然后在finally块中使用后关闭它。而且,对于给定的JMX连接器,成功拨打getMBeanServerConnection()的2个成功呼叫通常会返回相同的MBeanServerConnection关闭并发操作的JMX连接

某些操作被同时调用,并且它们中的每一个调用getMBeanServerConnection()。但是,他们获得了同样的连接。因此,当第一个操作完成时,剩下的操作将失败并显示“Connection Closed”错误。

我该如何解决这个问题?我应该创建多个连接器对象并调用getMBeanServerConnection()来检索不同的连接?或者,我是否需要使此方法同步(并降低效率)?

+0

'MBeanServerConnection'没有'close()'方法(http://download.oracle.com/javase/6/docs/api/javax/management/MBeanServerConnection.html)...你可以显示我们举个例子吗? – skaffman 2010-09-27 19:23:26

+1

我在JMXConnector的对象上调用close()方法(最初由JMXConnectionFactory的connect()方法返回) – Epitaph 2010-09-30 04:40:27

回答

3

我认为最简单的答案就是您需要使用同步并获得性能提升。

鉴于JMX呼叫是基于RMI /网络的,所以​​块将是非常便宜的比较。您实现的具有使用计数器的任何解决方案都会受到竞争条件的影响 - 尤其是考虑到JMXConnector很可能无法防止关闭/连接竞争条件。例如,有人可能在别人连接的同时关闭连接,并可能关闭新的连接。

我想你应该写一个包装类(或方法)到连接器。它会:

  • 有一个会叫connect()(仅在使用计数器为0),调用getMBeanServerConnection(),并增加使用非处方和返回连接的连接方法。
  • 有一个密切的方法可以减少使用计数器,如果它是0则调用close。
  • 要同步以避免竞争条件。

祝你好运。

相关问题