1、前言
JMX管理及使用日趨成熟。spring對bean的管理功能也很強大,通過annotation把某些方法暴露成MBean,然后通過JMX遠程管理,在某些場景下會帶來意想不到的效果。
?
本文只介紹兩個內容:spring通過annotation暴露MBean、相關的xml配置。
?
?
2、spring通過annotation暴露MBean
?
??????2.1?? 涉及到三個重要的annotation:@ManagedResource @ManagedAttribute 和 @ManagedOperation。
?
用途 Commons Attributes屬性 JDK 5.0注解 屬性/注解類型
將類的所有實例標識為JMX受控資源 |
ManagedResource
|
@ManagedResource
|
Class 類 |
將方法標識為JMX操作 |
ManagedOperation
|
@ManagedOperation
|
Method方法 |
將getter或者setter標識為部分JMX屬性 |
ManagedAttribute
|
@ManagedAttribute
|
Method (only getters and setters) 方法(僅getters和setters) |
定義操作參數說明
|
ManagedOperationParameter
|
@ManagedOperationParameter 和@ManagedOperationParameters
|
Method 方法
|
?
?
????2.2?? 看了上面官方解釋,應該有個大概的了解,下面再舉個例子。
?
-
@ManagedResource
(objectName=
"bean:name=lionbuleTest"
,?description=
"My?Managed?Bean"
)??
-
public
?
class
?AnnotationTestMBean{??
-
????private?String?name;??
-
????private?int?age;??
-
??????
-
????@ManagedAttribute(description="The?Name?Attribute")??
-
????public?void?setName(String?name)?{??
-
????????this.name?=?name;??
-
????}??
-
??
-
????@ManagedAttribute()??
-
????public?String?getName()?{??
-
????????return?name;??
-
????}????
-
????public?int?getAge()?{??
-
????????return?age;??
-
????}??
-
????public?void?setAge(int?age)?{??
-
????????this.age?=?age;??
-
????}??
-
??????
-
????@ManagedOperation(description="Add?two?numbers")??
-
????@ManagedOperationParameters({??
-
????@ManagedOperationParameter(name?=?"x",?description?=?"The?first?number"),??
-
????@ManagedOperationParameter(name?=?"y",?description?=?"The?second?number")})??
-
????public?int?add_1(int?x,?int?y)?{??
-
????????return?x?+?y;??
-
????}??
-
??
-
????@ManagedOperation??
-
????public?int?add_2(int?x,?int?y){??
-
????????return?x?+?y;??
-
????}??
-
????
-
????public?void?dontExposeMe()?{??
-
????????throw?new?RuntimeException();??
-
????}??
-
??
-
}??
?
???2.3??Jconsole的管理界面截圖:
?
圖1、查看已暴露MBean的屬性
?
圖2、查看已暴露MBean的方法
?
???2.4?? 解釋說明:
?
???????? 1、@ManagedResource?@ManagedAttribute 和 @ManagedOperation?還有許多參數,具體使用請參考spring官方手冊。(?spring手冊[2.5.3] ---- 20.3.4.?源代碼級的元數據類型)
?
???????? 2、@ManagedOperationParameters 是對@ManagedOperation的補充。具體看代碼樣例中的add1方法上的注解,然后再看圖2(查看已暴露MBean的方法)的add1方法和add2的區別。添加參數說明的add1方法會顯示出參數名,而add2方法則是默認的參數名p1/p2。
?
???????? 3、沒有添加@ManagedOperation和@ManagedAttribute的方法,在圖2中就沒有看到,說明添加了注解的方法暴露MBean是可用的。
?
???????? 4、@ManagedOperation和@ManagedAttribute的區別,請查看2.1的詳解。
?
3、xml配置
? ? 方式一、通用spring bean配置
-
???
<
bean
?
id
=
"jmxAttributeSource"
??
-
?????????class="org.springframework.jmx.export.annotation.AnnotationJmxAttributeSource"/>??
-
?????
-
???<bean?id="assembler"??
-
?????????class="org.springframework.jmx.export.assembler.MetadataMBeanInfoAssembler">??
-
???????<property?name="attributeSource"?ref="jmxAttributeSource"/>??
-
???</bean>??
-
?????
-
???<bean?id="namingStrategy"??
-
?????????class="org.springframework.jmx.export.naming.MetadataNamingStrategy">??
-
???????<property?name="attributeSource"?ref="jmxAttributeSource"/>??
-
???</bean>??
-
???<bean?id="exporter"?class="org.springframework.jmx.export.MBeanExporter">??
-
???????<property?name="assembler"?ref="assembler"/>??
-
???????<property?name="namingStrategy"?ref="namingStrategy"/>??
-
???????<property?name="autodetect"?value="true"/>??
-
???</bean>??
-
??
-
??
-
<
bean
?
class
=
"org.springframework.remoting.rmi.RmiRegistryFactoryBean"
>
??????????
-
????<property?name="port"?value="2088"/>??
-
</
bean
>
??
-
<
bean
?
id
=
"serverConnector"
??
-
??????class="org.springframework.jmx.support.ConnectorServerFactoryBean">??
-
??<property?name="objectName"?value="connector:name=rmi"/>??
-
???????????
-
??<property?name="serviceUrl"??
-
????????????value="service:jmx:rmi://localhost/jndi/rmi://localhost:2088/myconnector"/>??
-
</
bean
>
??
-
??
-
??
-
???<bean?id="annotationTestMBean"?class="com.lionbule.biz.test.AnnotationTestMBean">??
-
???????<property?name="name"?value="TEST"/>??
-
???????<property?name="age"?value="100"/>??
-
???</bean>??
??? 配置中,已經加了相應的注釋。還不是很清楚,可以查詢spring官方手冊。
?
? ? 方式二、簡化spring-context配置
-
<?
xml
?
version
=
"1.0"
?
encoding
=
"UTF-8"
?>
??
-
<
beans
?
xmlns
=
"http://www.springframework.org/schema/beans"
??
-
????xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"??
-
????xmlns:context="http://www.springframework.org/schema/context"??
-
????xsi:schemaLocation="http://www.springframework.org/schema/beans??
-
????????????????????????http://www.springframework.org/schema/beans/spring-beans.xsd??
-
????????????????????????http://www.springframework.org/schema/context??
-
????????????????????????http://www.springframework.org/schema/context/spring-context.xsd"??
-
????default-autowire="byName">??
-
??
-
????<context:mbean-export?default-domain="ShowCase"?registration="replaceExisting"?/>??
-
??????
-
????<bean?id="annotationTestMBean"?class="com.lionbule.biz.test.AnnotationTestMBean">??
-
????????<property?name="name"?value="TEST"/>??
-
????????<property?name="age"?value="100"/>??
-
????</bean>??
-
</
beans
>
??
? ??注意:方式二對ClassName和beanName有約束,請以‘MBean’結尾。?
?
4、客戶端工具連接
?
??? 常用的客戶端工具:Jconsole、jvisualvm、jmanager等。
??? 連接方式有多種,但本案只介紹了RMI連接管理,所以本案的鏈接地址為:
-
service:jmx:rmi://localhost/jndi/rmi://localhost:2088/myconnector??
?
參考資料:
1、spring官方手冊
?????http://static.springsource.org/spring/docs/2.5.x/reference/jmx.html#jmx-interface
2. ?http://wiki.springside.org.cn/display/SpringSide3/JMX