3. 設定 quartz schedule jobs
jobdetails 跟 triggers 的設定有點多就不列出來了,請看程式下載區的完整範例
quartz 1.6 也支援 JMX,可透過 org.quartz.scheduler.jmx.export=true 來啟動
不過支援並不完整,只能看到 scheduler 的資訊,triggers 和 jobdetails 的資訊看不到
我自定 com.fw.jmx.quartz.SchedulerMBean 來解決這個問題(請下載quartzmbean.jar)
為了系統的穩定性,故除了 scheduler 可以執行 start, standby, shutdown 之外
triggers 和 jobdetails 都是不可更改及執行的,有需要的人可自行更改
下面是 mbean 的設定
1
2
3
4
|
<
bean
id
=
"schedulerMBean"
class
=
"com.fw.jmx.quartz.SchedulerMBean"
>
<
constructor-arg
ref
=
"scheduler"
/>
<
constructor-arg
ref
=
"triggers"
/>
</
bean
>
|
constructor第一個參數是 scheduler 的 reference
第二個參數是 trigger list 的 reference
4. export mbeans
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<bean id=
"mbeanServer"
class
=
"org.springframework.jmx.support.MBeanServerFactoryBean"
>
<property name=
"locateExistingServerIfPossible"
value=
"true"
/>
</bean>
<bean id=
"exporter"
class
=
"org.springframework.jmx.export.MBeanExporter"
>
<property name=
"beans"
>
<map>
<entry key=
"server:name=log4j"
value-ref=
"log4jMBean"
/>
<entry key=
"server:name=FWScheduler"
value-ref=
"schedulerMBean"
/>
</map>
</property>
<property name=
"server"
ref=
"mbeanServer"
/>
</bean>
|
mbean server 由 java.lang.management.ManagementFactory.getPlatformMBeanServer() 取得
MBeanExporter 則是註冊 mbeans 到 mbean server
entry key 是 mbean object name
value-ref 是上面定義的 mbean bean name
這邊註冊的 mbeans 只有兩個,因為 c3p0 會由 DynamicPooledDataSourceManagerMBean 來註冊
5. 執行程式
為了可以監控 mbeans 要在 java 指令後加上 -Dcom.sun.management.jmxremote 的參數
如 : java -Dcom.sun.management.jmxremote com.fw.jmx.TestMain
注意 : 這個參數是為了在 local 監控才需要,如用 mx4j HttpAdaptor(請看附錄)則不需要
6. 執行 jmx console
在命令列模式執行 jconsole
jconsole 抓到剛執行的程式,直接點選 Connect
選取 MBeans tab 會列出所有已註冊的 mbeans,上方有兩個 tabs,Attributes 和 Operations
以 FWScheduler 為例,可以看執行的狀況及啟動或停止所有的 schedules
附錄1
執行 jconsole 一定要在 local 裝 JDK 並不是那麼方便
想提供網頁供 administrator 設定可用 mx4j HttpAdaptor
方法很簡單
a. 多加兩個 bean 到 spring 設定檔
1
2
3
4
5
6
7
8
|
<
bean
id
=
"xsltProcessor"
class
=
"mx4j.tools.adaptor.http.XSLTProcessor"
/>
<
bean
id
=
"httpAdaptor"
class
=
"mx4j.tools.adaptor.http.HttpAdaptor"
>
<
property
name
=
"processor"
ref
=
"xsltProcessor"
/>
<
property
name
=
"port"
value
=
"9001"
/>
</
bean
>
|
b. 在 MBeanExporter 裡註冊
1
2
3
4
|
<
entry
key
=
"server:name=HttpAdaptor"
value-ref
=
"httpAdaptor"
/>
<
entry
key
=
"server:name=XSLTProcessor"
value-ref
=
"xsltProcessor"
/>
|
c. 更改啟動的 main method 加入
1
2
3
4
|
ClassPathXmlApplicationContext context =
new
ClassPathXmlApplicationContext(
"appContext.xml"
);
HttpAdaptor httpAdaptor = (HttpAdaptor) context.getBean(
"httpAdaptor"
);
httpAdaptor.start();
|
d. 連到 http://localhost:9001 就可以看到設定頁面啦
有點醜,有需要可自行更改 XSLTProcessor
附錄2
第二個選擇是用 JDMK HtmlAdaptorServer(需下載 jdmkrt.jar)
a. 加入 spring 設定檔
1
2
3
4
|
<
bean
id
=
"htmlAdapter"
class
=
"com.sun.jdmk.comm.HtmlAdaptorServer"
>
<
property
name
=
"port"
value
=
"9001"
/>
</
bean
>
|
b. 在 MBeanExporter 裡註冊
1
2
|
<
entry
key
=
"server:name=htmlAdapter"
value-ref
=
"htmlAdapter"
/>
|
c. 更改啟動的 main method 加入
1
2
3
4
5
|
ClassPathXmlApplicationContext context =
new
ClassPathXmlApplicationContext(
"appContext.xml"
);
HtmlAdaptorServer htmlAdapter = (HtmlAdaptorServer) context
.getBean(
"htmlAdapter"
);
htmlAdapter.start();
|
d. 連到 http://localhost:9001 就可以看到設定頁面啦
這比 mx4j 好看多了
執行環境
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
程式下載
appContext.xml
c3p0.properties
MyBean.java
TestMain.java
quartzmbean.jar(原始檔在此)
jdmkrt.jar
来源: http://fenriswolf.me/2012/03/20/jmx1-%E7%AE%A1%E7%90%86%E8%87%AA%E5%B7%B1%E7%9A%84-server/