2010-09-27 4 views
3

Я открываю соединение JMX с использованием метода getMBeanServerConnection(), а затем закрываю его после использования в блоке finally. И, для данного JMX-коннектора, 2 успешных звонка на getMBeanServerConnection() обычно возвращает то же самое MBeanServerConnection.Закрытие соединения JMX для параллельных операций

Некоторые из операций вызываются одновременно, и каждый из них вызывает getMBeanServerConnection(). Но они получают ТАКОЕ соединение. И поэтому, когда первая операция завершается, оставшаяся операция завершится с ошибкой «Соединение закрыто».

Как я могу это решить? Должен ли я создавать несколько объектов коннектора и вызывать на них getMBeanServerConnection() для получения разных соединений? Или мне нужно сделать этот метод синхронизированным (и снизить эффективность)?

+0

'MBeanServerConnection' не имеет метода' close() '(http://download.oracle.com/javase/6/docs/api/javax/management/MBeanServerConnection.html) ... вы можете показать нам пример? – skaffman

+1

Я вызываю метод close() на объекте JMXConnector (первоначально возвращаемый методом connect() JMXConnectionFactory) – Epitaph

ответ

3

Я думаю, что короткий ответ заключается в том, что вам нужно использовать синхронизацию и принять удар производительности.

Учитывая, что JMX-вызовы являются RMI/сетью, блок synchronized будет очень дешево в сравнении. Любое решение, которое вы реализуете, имеющее счетчик использования, будет страдать от условий гонки, особенно учитывая, что JMXConnector, скорее всего, не имеет защиты от условий закрытия/соединения. Например, кто-то может закрыть соединение в то же время, когда кто-то подключается, и новое соединение может быть закрыто.

Я думаю, что вы должны написать класс (или метод) оболочки для соединителя. Было бы:

  • Есть соединять метод, который называют бы connect() (только если использование счетчик был 0), называют getMBeanServerConnection(), и приращение использования-счетчик и возвращает соединение.
  • Имейте близкий метод, который уменьшает счетчик использования и вызывает закрытие, если он равен 0.
  • Быть синхронизированным, чтобы избежать условий гонки.

Удачи.

Смежные вопросы