2015-09-27 64 views
0

我在我的應用程序中使用了pooledDataSources。 Mbean的ObjectName爲PooledDataSource包含可變部分。例如:如何獲得c3p0 mbeans對象的固定對象名稱

的ObjectName = com.mchange.v2.c3p0:類型= PooledDataSource [z8kfsx9c4bily2​​r1i962 | 23696a1b]

具有變量作爲z8kfsx9c4bily2​​r1i962 | 23696a1b和它的變化每次我重新啓動我的服務。爲了監控目的,我必須爲我的mbean獲取固定的ObjectName。我正在使用jmx進行監控。我試圖覆蓋vmid屬性,但它似乎是一個不可寫屬性。在這方面進行了大量的研究,但運氣不佳。

我JMX配置如下:提前

<jmxtrans-agent> <queries> <!-- C3P0 --> <query objectName="com.mchange.v2.c3p0:type=PooledDataSource" attribute="threadPoolNumTasksPending" resultAlias="cp.threadPoolNumTasksPending"/> </queries> </jmxtrans-agent>

感謝

回答

3

默認情況下,C3P0 JMX的名字是這樣的:

com.mchange.v2.c3p0:type=PooledDataSource,identityToken=<variable, opaque token> 

爲了得到恆定的標識符,則必須確保已設置屬性dataSourceName。要做到這一點,最好的方法是在施工給您DataSource一個名字:

ComboPooledDataSource cpds = new ComboPooledDataSource("Jojo") 

但你也可以設置dataSourceName像任何其他C3P0 config屬性。

那麼你必須看起來像JMX的名字:

com.mchange.v2.c3p0:type=PooledDataSource,identityToken=<variable, opaque token>,name=Jojo 

許多JMX客戶端讓你按屬性進行搜索,因此這足以給自己一個永久的監視器。

如果你真的需要一個恆定的,固定的,JMX的名字,你可以設置屬性

com.mchange.v2.c3p0.management.ExcludeIdentityToken=true 

這可以走在c3p0.properties文件,爲系統屬性,或者作爲一個HOCON /類型安全配置路徑,取決於你如何配置c3p0。如果設置該屬性和還設置dataSourceName(再次,通過構造函數或在你的配置),那麼你的JMX名稱將是可預測的,固定的字符串,如

com.mchange.v2.c3p0:type=PooledDataSource,name=Jojo 

這將是由你來確保這些名稱是唯一的。

注:com.mchange.v2.c3p0.management.ExcludeIdentityToken=true是一個新十歲上下的功能,請確保您使用的是最新c3p0-0.9.5.1

有關詳細信息,請參閱C3P0的JMX configuration docs

+0

感謝您的解決方案。我在我的bean中設置dataSourceName屬性,並設置System.setProperty(「com.mchange.v2.c3p0.management.ExcludeIdentityToken」,「true」);但是mbean objectName仍然與vmid一起發佈。我試着將屬性'com.mchange.v2.c3p0.VMID'也設置爲NONE,但也沒有運氣。但在升級c3p0版本後,m現在至少能夠設置所有這些屬性。 – sasuke

+0

嗨。不要打擾VMID的東西。那不會幫助你。使用System.setProperty(...)將是非常脆弱的,因爲這是否有效取決於您的調用順序與c3p0配置類的加載。如果要在系統屬性中設置c3p0 config,最好在VM啓動時使用-D = 。實際上,最好製作一個c3p0.properties文件並放在那裏(除非你已經在使用typesafe-config,在這種情況下使用它)。如果這很簡單,我很抱歉;我正在寫電話。 –

+0

非常感謝史蒂夫:) – sasuke