l

2011年12月21日 星期三

用 Java 存取存取 WMI,請選擇

December 21 21:55~22:58


前一陣子學弟提到要寫一個 Robot test case 來測試 SyncFree (一個開放原始碼檔案同步軟體,由北科大資工系軟體系統實驗室開發),這個 test case 需要準備某種測試環境:

  • 在 Windows 上用網路芳鄰開放一個共享的目錄,此目錄作為測試檔案同步功能的來源端(source)。
  • 在 Ubuntu 上的本地端硬碟建立一個目錄,此目錄作為測試檔案同步功能的目的端(destination)。

這個 Robot test case 要測什麼呢?要測試當 SyncFree 正在執行同步檔案功能的時候(同步尚未全部完成的當下),source 端的網芳共享目錄突然中斷了。在此情況下,SyncFree 還是要確保來源和目的端的資料以及系統的狀態都是正確的。換句話說,這是一個 robustness test case(測試 SyncFree 軟體的 耐操度 強健度)。


學弟提出了一個問題,


學弟:這個 Robot test case 沒辦法完全自動化耶,因為不知道要如何在同步到一半的時候把網芳共享目錄給中斷。


Teddy:那有可能不行。你可以在 Robot 程式中呼叫一個外部 script,然後用這個 Windows 上的 script 來停掉網芳共享目錄


Teddy:或是你可以透過 WMI(Windows Management Instrumentation)直接寫 Java 程式來關閉網芳共享目錄。

學弟:啥米!有這種東西....

***

在 Windows 平台上,透過 WMI 可以做到許多管理與查詢的功能,例如,查詢 CPU 負載,網路封包,服務(service)的狀態等等。也可以啟動或是停止服務。有興趣的鄉民可以自行查一下 WMI 的文件。Teddy 今天要介紹的是三個 Java 開放原始碼元件,讓鄉民們可以用 Java 來存取 WMI

這三個元件分別是:

  • com4j,MIT 授權,支援 64/32-bit JVM
  • j-Interop (Pure Java - COM Bridge),支援 64/32-bit JVM
  • JACOB (Java COM Bridge),LGPL 授權支援 64/32-bit JVM

說是介紹,其實也不算是介紹,應該說是推薦使用,這樣鄉民們就可以省去一些『試用期』。首先看一下授權,如果鄉民們的軟體是不開放原始碼的軟體,那麼使用 MIT 和 LGPL 的授權應該是 OK 的(不會因為使用這些元件而被迫開放自己的原始碼...如果 Teddy 有說錯請糾正)。


關於 com4j,Teddy 用過的經驗是在 64-bit 環境下(64-bit OS and 64-bit JVM),曾經發生過把 Windows WMI service 搞到掛掉的情況,但是在 32-bit 環境下卻很正常,所以不太推薦。


j-Interop 是完全用 Java 開發的軟體,沒有任何的 native code(其他兩個都有用 C/C++ 寫的 native code)。j-Interop 實做 DCOM 通訊協定,所以可以透過網路去存取其他電腦的 WMI 服務。但是缺點是,如果你要存取的是本機電腦,似乎(Teddy 不是 100% 肯定)也要提供一組帳號,密碼才可以存取 WMI 服務。com4j 和 JACOB 就沒有這樣的限制。


在 Jenkins(一個超好用的開放原始碼持續整合系統)中就有用到這個 j-Interop 來啟動與管理遠端 Windows 機器中的建構環境(支援 distributed build 的功能)。所以如果鄉民們有類似 Jenkins 這樣遠端存取其 Windows 電腦 WMI 服務需求的話,那麼用 j-Interop 是不錯的選擇。


如果是要存取本地端的 WMI 服務又不希望使用者一定要設定帳號與密碼的話,最後這個 JACOB 是 Teddy 推薦的元件。在  64-bit 與 32-bit 環境下工作都滿正常的。


講完收工。


***

友藏內心獨白:範例程式網路上找一下就有了。

沒有留言:

張貼留言