关闭并发操作的 JMX 连接

Epi*_*aph 4 java multithreading jmx

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

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

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

Gra*_*ray 5

我认为简短的答案是您需要使用同步并承受性能损失。

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

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

  • 有一个 connect 方法,该方法将调用connect()(仅当使用计数器为 0 时)、调用getMBeanServerConnection()并递增使用计数器并返回连接。
  • 有一个 close 方法,该方法会减少使用计数器并在其为 0 时调用 close。
  • 保持同步以避免竞争条件。

祝你好运。