JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » EJB / 其它Java EE 討論區  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友   
reply to postflat modego to previous topicgo to next topic
己加入精華區
by koji at 2008-09-24 23:56
本主題所含的標籤
無標籤
作者 Re:JMX應用篇 [Re:Fenris]
Fenris





發文: 68
積分: 4
於 2008-09-24 22:59 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
JMX(2) - 自訂 mbeans
在複雜的系統裡需要監控的資源不是只有 log, datasources, schedule jobs 那麼簡單
還會有自訂的一些資源
JMX 提供了 Standard MBean 和 Dynamic MBean 兩種實作方式
不過這篇文章會以 spring 來定義及控管自訂的 mbeans

1. export services to mbeans
假設在系統中已經有一個 ResourceBundleService 來存取 env.properties,程式如下
ResourceBundleService.java
1
2
3
4
5
public interface ResourceBundleService {
    public String getString(String key);
 
    public String getBaseName();
}


ResourceBundleServiceImpl.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class ResourceBundleServiceImpl implements ResourceBundleService,
        InitializingBean {
    private String baseName;
    private ResourceBundle resourceBundle;
 
    public String getString(String key){
        return resourceBundle.getString(key);
    }
    
    public void afterPropertiesSet() throws Exception {
        resourceBundle = ResourceBundle.getBundle(baseName);
    }
 
    public String getBaseName() {
        return baseName;
    }
 
    public void setBaseName(String baseName) throws Exception {
        this.baseName = baseName;
        afterPropertiesSet();
    }
}


在 spring 的定義
1
2
3
4
<bean id="resourceBundleService"
    class="com.fw.jmx.ResourceBundleServiceImpl">
    <property name="baseName" value="env" />
</bean>


註冊成 mbean 的方法非常簡單,只要在 MBeanExporter 裡直接設定就好了
1
2
3
4
5
6
7
8
9
10
<bean id="exporter"
    class="org.springframework.jmx.export.MBeanExporter">
    <property name="beans">
        <map>
            <entry key="server:name=resourceBundleService"
                value-ref="resourceBundleService" />
        </map>
    </property>
    <property name="server" ref="mbeanServer" />
</bean>


接下來就是看執行結果



既然這麼容易,為什麼 log4j、c3p0 datasource、quartz schedule job 不用這種方式設定???
原因有三個
a. 最重要的一點,call setBaseName method 並不會更新 ResourceBundle。
一般來說,執行時期不會去更改系統參數,所以要特別注意
b. spring 用 reflection 的方式抓出 ResourceBundleServiceImpl 所有的 methods,包括不需要用到的 methods 如 afterPropertiesSet()
c. 畫面顯示的資訊並不完整,如 methods 沒有說明,參數以 p1、p2 顯示

第一個問題要改 setBaseName method,加入 reload propertiles file 的動作
1
2
3
4
public void setBaseName(String baseName) throws Exception {
    this.baseName = baseName;
    afterPropertiesSet();
}


其他的問題可由設定 Assembler 解決

2. 定義 Assembler
spring 定義了好幾種 assemblers 可供設定
a. SimpleReflectiveMBeanInfoAssembler : 這是 spring 預設的 assembler,結果如上面顯示就不多做介紹

b. InterfaceBasedMBeanInfoAssembler : 可過濾不需要的 methods
先定義一個新的 interface,少了 afterPropertiesSet method
1
2
3
4
5
6
7
public interface ResourceBundleServiceMBean {
    public String getString(String key);
 
    public String getBaseName();
 
    public void setBaseName(String baseName);
}

這裡不延用 ResourceBundleService interface
因為 setBaseName method 應該要由 administrator 來設定
而不是由 developer 透過程式控制

在 spring 中 assembler 的定義
1
2
3
4
5
6
7
8
9
10
<bean id="assembler"
  class="org.springframework.jmx.export.assembler.InterfaceBasedMBeanInfoAssembler">
    <property name="interfaceMappings">
        <props>
            <prop key="resourceBundleService">
                com.fw.jmx.ResourceBundleServiceMBean
            </prop>
        </props>
    </property>
</bean>


在 MBeanServerFactoryBean 加入 assembler 的參數
1
<property name="assembler" ref="assembler" />


c. MetadataMBeanInfoAssembler : 用 annotation 的方式定義,可設定最完整的資訊
annotation 的用法蠻直覺的就不多做解釋
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
@ManagedResource(description = "ResourceBundleService MBean")
public class ResourceBundleServiceImpl implements ResourceBundleService,
        InitializingBean {
    private String baseName;
    private ResourceBundle resourceBundle;
 
    @ManagedOperation(description="Gets a string for the given key")
    @ManagedOperationParameters({
      @ManagedOperationParameter(name = "key", 
                                 description = "the key for the desired string")})
    public String getString(String key) {
        return resourceBundle.getString(key);
    }
 
    public void afterPropertiesSet() throws Exception {
        resourceBundle = ResourceBundle.getBundle(baseName);
    }
 
    @ManagedAttribute(defaultValue="env")
    public String getBaseName() {
        return baseName;
    }
 
    @ManagedAttribute(description="the base name of the resource bundle")
    public void setBaseName(String baseName) throws Exception {
        this.baseName = baseName;
        afterPropertiesSet();
    }
}


接下來是 spring 的定義
1
2
3
4
5
6
7
<bean id="attributeSource"
  class="org.springframework.jmx.export.annotation.AnnotationJmxAttributeSource" />
    
<bean id="assembler"
    class="org.springframework.jmx.export.assembler.MetadataMBeanInfoAssembler">
    <property name="attributeSource" ref="attributeSource" />
</bean>


1.5 jconsole 的結果,滑鼠移上去就會顯示 tooltip


這是 1.6 jconsole 的結果,所有資訊比較一目了然


執行環境
JDK 1.5.0_11(因為 1.6 的 jconsole 太醜了)
spring 2.5
log4j 1.2.14
c3p0 0.9.1.2
quartz 1.6
mx4j 3.0.2

參考資料
JMX Tutorial
Spring JMX
log4j 1.2
c3p0
Quartz JMX Management
MX4J
Java Dynamic Management Kit

程式下載
ResourceBundleService.java
ResourceBundleServiceImpl.java
ResourceBundleServiceMBean.java
appContext.xml


Fenris edited on 2008-09-24 23:08
reply to postreply to post
玩人生online,選賺錢職業,進朋友公會,打家庭副本,衝公司聲望,解客戶任務,買把妹座騎,點戀愛天賦,修虎爛技能,集3C套裝
話題樹型展開
人氣 標題 作者 字數 發文時間
5873 [精華] JMX應用篇 Fenris 7133 2008-09-24 03:40
4893 Re:JMX應用篇 Fenris 6360 2008-09-24 22:59
5643 Re:JMX應用篇 Fenris 2924 2008-09-24 23:08
» JWorld@TW »  EJB / 其它Java EE 討論區

reply to postflat modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8