看到有很多朋友的支持,在些表示非常感謝。即然平臺(tái)已經(jīng)搭建完成,接下就讓需要一起來(lái)完善這些真正在應(yīng)用的組件開發(fā),所以我利用業(yè)余時(shí)間,開發(fā)了一個(gè)Tomcat服務(wù)監(jiān)控組件和一個(gè)郵件通知服務(wù)組件。
下載地址
二進(jìn)制程序
第三方類庫(kù)下載,第三方類庫(kù)下載2 放到lib目錄下。
api-docs
源代碼
先來(lái)介紹Tomcat服務(wù)監(jiān)控組件的實(shí)現(xiàn),該監(jiān)控組件目前實(shí)現(xiàn)了以下方面信息的監(jiān)控:
1. Jvm堆內(nèi)存和非堆內(nèi)存的監(jiān)控(可以設(shè)置使用的百分比或是具體使用的內(nèi)存大小)
2. 當(dāng)前操作文件打開的IO文件個(gè)數(shù)監(jiān)控。 一般操作默認(rèn)設(shè)置的最大值是1024,如果超過(guò)這個(gè)服務(wù)會(huì)導(dǎo)致Tomcat所有服務(wù)的停止。
3. 數(shù)據(jù)庫(kù)連接池的監(jiān)控(可以設(shè)置使用的百分比或是具體使用的連接數(shù)大小)
4. Tomcat服務(wù)模塊(Web Module)的運(yùn)行狀態(tài)的監(jiān)控(監(jiān)控其狀態(tài)是否為運(yùn)行狀態(tài))
監(jiān)控的方式通過(guò)Jmx取得當(dāng)前Tomcat的服務(wù)狀態(tài),需要tomcat開始jmx服務(wù)。
方法如下:在startup.sh命令行中(linux)加入以下命令
export JAVA_OPTS=" -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8060 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"
windows下使用:
set JAVA_OPTS=" -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8060 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"
下面我們來(lái)看一下該監(jiān)控組件的實(shí)現(xiàn)類圖

下面我們來(lái)操作一下如何使用Spring注冊(cè)該組件(spy2servers.xml),使用其監(jiān)控平臺(tái)工作起來(lái)。
1 <bean class="org.xmatthew.spy2servers.component.spy.jmx.TomcatJmxSpyComponent">
2 <!-- 監(jiān)控的Jmx服務(wù)IP -->
3 <property name="host" value="x.x.x.x"></property>
4 <!-- 監(jiān)控的Jmx服務(wù)端口 -->
5 <property name="port" value="8060"></property>
6 <!-- 監(jiān)控時(shí)間間隔 單秒是 毫秒 -->
7 <property name="detectInterval" value="5000"></property>
8
9 <property name="heapMemorySpy"> <!-- 堆內(nèi)存 監(jiān)控方案 -->
10 <bean class="org.xmatthew.spy2servers.component.spy.jmx.MemorySpy">
11 <!-- 設(shè)置臨界值 內(nèi)存使用的百分比 使用的內(nèi)存值 / 最大內(nèi)存值。 注如果該值設(shè)置, memoryUsedToAlert自動(dòng)失效-->
12 <property name="memoryUsedPercentToAlert" value="5"></property>
13 <!-- 設(shè)置臨界值 內(nèi)存超過(guò)一定值后觸發(fā) 單位 Mb -->
14 <!-- <property name="memoryUsedToAlert" value="100"></property> -->
15 <!-- 設(shè)置臨界值保持多久后,開始報(bào)警 單位秒。 注該值沒有默認(rèn)值,如果不認(rèn)置則不會(huì)觸發(fā)報(bào)警操作 -->
16 <property name="alertAfterKeepTimeLive" value="10"></property>
17 </bean>
18 </property>
19 <property name="nonHeatMemorySpy"><!-- 非堆內(nèi)存 監(jiān)控方案 -->
20 <bean class="org.xmatthew.spy2servers.component.spy.jmx.MemorySpy">
21 <property name="memoryUsedToAlert" value="100"></property>
22 <property name="alertAfterKeepTimeLive" value="10"></property>
23 </bean>
24 </property>
25 <property name="fileSpy">
26 <bean class="org.xmatthew.spy2servers.component.spy.jmx.FileSpy">
27 <!-- 設(shè)置臨界值 文件打開數(shù)百分比 開始的文件數(shù) / 最大的文件數(shù)。 注如果該值設(shè)置, filesOpenedToAlert自動(dòng)失效 -->
28 <property name="filesOpenedPercentToAlert" value="90"></property>
29 <!-- 設(shè)置臨界值 文件打開數(shù) -->
30 <!-- <property name="filesOpenedToAlert" value="1000"></property> -->
31 <!-- 設(shè)置臨界值保持多久后,開始報(bào)警 單位秒。 注該值沒有默認(rèn)值,如果不認(rèn)置則不會(huì)觸發(fā)報(bào)警操作 -->
32 <property name="alertAfterKeepTimeLive" value="2"></property>
33 </bean>
34 </property>
35
36 <property name="dataSourcesSpy"><!-- 文件IO打開數(shù) 監(jiān)控方案 -->
37 <bean class="org.xmatthew.spy2servers.component.spy.jmx.DataSourcesSpy">
38 <property name="dataSourceSpys">
39 <set>
40 <bean class="org.xmatthew.spy2servers.component.spy.jmx.DataSourceSpy">
41 <!-- 設(shè)置臨界值 連接池連接數(shù)占用比例 使用的連接數(shù) / 最大的連接數(shù)。 注如果該值設(shè)置, numActiveToAlert自動(dòng)失效 -->
42 <property name="numActivePercentToAlert" value="90"></property>
43 <!-- 設(shè)置臨界值 連接池連目前使用的連接數(shù) -->
44 <!-- <property name="numActiveToAlert" value="20"></property> -->
45 <property name="dataSourceName" value="jdbc/opendb"></property>
46 </bean>
47 </set>
48 </property>
49 </bean>
50 </property>
51
52 <property name="webModuleSpy"><!-- Web Module 監(jiān)控方案 -->
53 <bean class="org.xmatthew.spy2servers.component.spy.jmx.WebModuleSpy">
54 <property name="webModules"> <!-- 監(jiān)控的web module列表,如果模塊狀態(tài)為stop或undeploy則會(huì)報(bào)觸發(fā)報(bào)警 -->
55 <set>
56 <value>/</value>
57 <value>/jsp-examples</value>
58 <value>/servlets-examples</value>
59 </set>
60 </property>
61 </bean>
62 </property>
63 </bean>
2 <!-- 監(jiān)控的Jmx服務(wù)IP -->
3 <property name="host" value="x.x.x.x"></property>
4 <!-- 監(jiān)控的Jmx服務(wù)端口 -->
5 <property name="port" value="8060"></property>
6 <!-- 監(jiān)控時(shí)間間隔 單秒是 毫秒 -->
7 <property name="detectInterval" value="5000"></property>
8
9 <property name="heapMemorySpy"> <!-- 堆內(nèi)存 監(jiān)控方案 -->
10 <bean class="org.xmatthew.spy2servers.component.spy.jmx.MemorySpy">
11 <!-- 設(shè)置臨界值 內(nèi)存使用的百分比 使用的內(nèi)存值 / 最大內(nèi)存值。 注如果該值設(shè)置, memoryUsedToAlert自動(dòng)失效-->
12 <property name="memoryUsedPercentToAlert" value="5"></property>
13 <!-- 設(shè)置臨界值 內(nèi)存超過(guò)一定值后觸發(fā) 單位 Mb -->
14 <!-- <property name="memoryUsedToAlert" value="100"></property> -->
15 <!-- 設(shè)置臨界值保持多久后,開始報(bào)警 單位秒。 注該值沒有默認(rèn)值,如果不認(rèn)置則不會(huì)觸發(fā)報(bào)警操作 -->
16 <property name="alertAfterKeepTimeLive" value="10"></property>
17 </bean>
18 </property>
19 <property name="nonHeatMemorySpy"><!-- 非堆內(nèi)存 監(jiān)控方案 -->
20 <bean class="org.xmatthew.spy2servers.component.spy.jmx.MemorySpy">
21 <property name="memoryUsedToAlert" value="100"></property>
22 <property name="alertAfterKeepTimeLive" value="10"></property>
23 </bean>
24 </property>
25 <property name="fileSpy">
26 <bean class="org.xmatthew.spy2servers.component.spy.jmx.FileSpy">
27 <!-- 設(shè)置臨界值 文件打開數(shù)百分比 開始的文件數(shù) / 最大的文件數(shù)。 注如果該值設(shè)置, filesOpenedToAlert自動(dòng)失效 -->
28 <property name="filesOpenedPercentToAlert" value="90"></property>
29 <!-- 設(shè)置臨界值 文件打開數(shù) -->
30 <!-- <property name="filesOpenedToAlert" value="1000"></property> -->
31 <!-- 設(shè)置臨界值保持多久后,開始報(bào)警 單位秒。 注該值沒有默認(rèn)值,如果不認(rèn)置則不會(huì)觸發(fā)報(bào)警操作 -->
32 <property name="alertAfterKeepTimeLive" value="2"></property>
33 </bean>
34 </property>
35
36 <property name="dataSourcesSpy"><!-- 文件IO打開數(shù) 監(jiān)控方案 -->
37 <bean class="org.xmatthew.spy2servers.component.spy.jmx.DataSourcesSpy">
38 <property name="dataSourceSpys">
39 <set>
40 <bean class="org.xmatthew.spy2servers.component.spy.jmx.DataSourceSpy">
41 <!-- 設(shè)置臨界值 連接池連接數(shù)占用比例 使用的連接數(shù) / 最大的連接數(shù)。 注如果該值設(shè)置, numActiveToAlert自動(dòng)失效 -->
42 <property name="numActivePercentToAlert" value="90"></property>
43 <!-- 設(shè)置臨界值 連接池連目前使用的連接數(shù) -->
44 <!-- <property name="numActiveToAlert" value="20"></property> -->
45 <property name="dataSourceName" value="jdbc/opendb"></property>
46 </bean>
47 </set>
48 </property>
49 </bean>
50 </property>
51
52 <property name="webModuleSpy"><!-- Web Module 監(jiān)控方案 -->
53 <bean class="org.xmatthew.spy2servers.component.spy.jmx.WebModuleSpy">
54 <property name="webModules"> <!-- 監(jiān)控的web module列表,如果模塊狀態(tài)為stop或undeploy則會(huì)報(bào)觸發(fā)報(bào)警 -->
55 <set>
56 <value>/</value>
57 <value>/jsp-examples</value>
58 <value>/servlets-examples</value>
59 </set>
60 </property>
61 </bean>
62 </property>
63 </bean>
這樣該組件就可以工作,下面是如何配置郵件通知組件。該組對(duì)當(dāng)簡(jiǎn)單一些
實(shí)現(xiàn)類圖如下:

配置好需要通知的郵件列表和登錄的郵件服務(wù)器就可以了
1 <bean class="org.xmatthew.spy2servers.component.alert.EmailAlertComponent">
2 <property name="emails" ref="emails"/>
3 <property name="emailAccount">
4 <bean class="org.xmatthew.spy2servers.component.alert.EmailAccount">
5 <property name="server" value="smtp.163.com"></property>
6 <property name="serverPort" value="25"></property>
7 <property name="loginName" value="ant_miracle"></property>
8 <property name="loginPwd" value="xxx"></property>
9 <property name="sender" value="ant_miracle@163.com"></property>
10 <property name="sendNick" value="EmailAlertComponent"></property>
11 </bean>
12 </property>
13 </bean>
14
15 <util:list id="emails">
16 <value>ant_miracle@163.com</value>
17 </util:list>
2 <property name="emails" ref="emails"/>
3 <property name="emailAccount">
4 <bean class="org.xmatthew.spy2servers.component.alert.EmailAccount">
5 <property name="server" value="smtp.163.com"></property>
6 <property name="serverPort" value="25"></property>
7 <property name="loginName" value="ant_miracle"></property>
8 <property name="loginPwd" value="xxx"></property>
9 <property name="sender" value="ant_miracle@163.com"></property>
10 <property name="sendNick" value="EmailAlertComponent"></property>
11 </bean>
12 </property>
13 </bean>
14
15 <util:list id="emails">
16 <value>ant_miracle@163.com</value>
17 </util:list>
最后我們?cè)倥渲靡幌峦ㄖ?wù)的規(guī)則。
下面的規(guī)則表示,TomcatJmxSpyComponent(組件名)的消息都會(huì)調(diào)度到EmailAlertComponent(組件名)。
1 <bean id="simpleAlertRule" class="org.xmatthew.spy2servers.rule.SimpleAlertRule">
2 <property name="channles">
3 <set>
4 <ref bean="channel1" />
5 </set>
6 </property>
7 </bean>
8
9 <bean id="channel1" class="org.xmatthew.spy2servers.rule.Channel">
10 <property name="from">
11 <set>
12 <value>TomcatJmxSpyComponent</value>
<!-- more components -->
13 </set>
14 </property>
15 <property name="to">
16 <set>
17 <value>EmailAlertComponent</value>
18 </set>
19 </property>
20 </bean>
2 <property name="channles">
3 <set>
4 <ref bean="channel1" />
5 </set>
6 </property>
7 </bean>
8
9 <bean id="channel1" class="org.xmatthew.spy2servers.rule.Channel">
10 <property name="from">
11 <set>
12 <value>TomcatJmxSpyComponent</value>
<!-- more components -->
13 </set>
14 </property>
15 <property name="to">
16 <set>
17 <value>EmailAlertComponent</value>
18 </set>
19 </property>
20 </bean>
好了,基本的配置最是這些,應(yīng)用程序和源代碼已經(jīng)上傳大家可以自寫閱覽。大家如有任何問(wèn)題請(qǐng)回復(fù)給我。
Good luck!
Yours Matthew!