我使用getMBeanServerConnection()
方法打开JMX连接,然后在finally块中使用后关闭它。并且,对于给定的JMX连接器,成功调用getMBeanServerConnection()
通常会返回相同的MBeanServerConnection
。
同时调用某些操作,并且每个操作都调用getMBeanServerConnection()
。但是,他们获得了相同的连接。因此,当第一个操作完成时,剩余的操作将因“连接已关闭”错误而失败。
我该如何解决这个问题?我应该创建多个连接器对象并在它们上调用getMBeanServerConnection()
来检索不同的连接吗?或者,我是否需要使此方法同步(并降低效率)?
答案 0 :(得分:4)
我认为简短的回答是你需要使用同步并降低性能。
鉴于JMX调用是基于RMI /网络的,相比之下synchronized
块非常便宜。您实现的具有使用计数器的任何解决方案都会受到竞争条件的影响 - 特别是考虑到JMXConnector很可能没有针对关闭/连接竞争条件的保护。例如,有人可能在其他人连接的同时关闭连接,并且可能关闭新连接。
我认为你应该为连接器编写一个包装类(或方法)。它会:
connect()
的连接方法(仅当使用计数器为0时),调用getMBeanServerConnection()
,并递增使用计数器并返回连接。祝你好运。