2010-09-27 54 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。
  • 要同步以避免競爭條件。

祝你好運。

相關問題