关闭JMX Connection以进行并发操作

时间:2010-09-27 19:21:08

标签: java multithreading jmx

我使用getMBeanServerConnection()方法打开JMX连接,然后在finally块中使用后关闭它。并且,对于给定的JMX连接器,成功调用getMBeanServerConnection()通常会返回相同的MBeanServerConnection

同时调用某些操作,并且每个操作都调用getMBeanServerConnection()。但是,他们获得了相同的连接。因此,当第一个操作完成时,剩余的操作将因“连接已关闭”错误而失败。

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

1 个答案:

答案 0 :(得分:4)

我认为简短的回答是你需要使用同步并降低性能。

鉴于JMX调用是基于RMI /网络的,相比之下synchronized非常便宜。您实现的具有使用计数器的任何解决方案都会受到竞争条件的影响 - 特别是考虑到JMXConnector很可能没有针对关闭/连接竞争条件的保护。例如,有人可能在其他人连接的同时关闭连接,并且可能关闭新连接。

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

  • 有一个可以调用connect()的连接方法(仅当使用计数器为0时),调用getMBeanServerConnection(),并递增使用计数器并返回连接。
  • 有一个close方法可以减少使用率计数器,如果为0则调用close。
  • 同步以避免竞争条件。

祝你好运。