看板java
標 題Re: java可以用來寫 windows常駐程式或服務嗎?
發信站鳥窩 BBS (Tue Dec 19 23:18:25 2000)
轉信站Ptt!news.ntu!freebsd.ntu!News.Math.NCTU!birdnest
※ 引述《[email protected] (無敵噴飯雞)》之銘言:
: ==> 在 [email protected] (山豬) 的文章中提到:
: > 如果是在NT/2000的話,我想最快的方法就是用resource kit裡的srvany
: > 它可以把.exe裝成service
: > 就把你的命令列(java -cp <classpath> <classname>)設到srvany裡就可以了
: 這樣的 services 只能 start or stop...
: 如果要真的寫成 windows service, 那用 M$ 牌的 JavaVM, 可以
: 做的到... 記得 com.ms.xxx 某個 package 裡.. 你的 ap 只要去
: implements 裡面的 interface, 就是個標準的 windows services
: 了..
: 但是這樣用,唯一賺到的地方就是你不必去用 c++ 等等寫 services..
: java 其它優點, 跨平台.. etc 全沒了.
如果真的需要用 Java 來寫 NT 的 Service,
這是一個蠻方便的方式.. (不過就被綁在 NT 跟 MSJavaVM 上..)
(至於是否有額外的優點, 下面這個小範例會提到.. :)
要使用 import com.ms.service.*; 來寫一個 NT 的 Service 非常簡單,
不太要求的話, 下面這樣的程式就可以了:
import java.io.*;
import java.util.*;
import com.ms.service.*;
public class ServiceMain extends Service
{
public ServiceMain(String[] args) throws Exception
{
CheckPoint(1000);
setRunning(ACCEPT_SHUTDOWN | ACCEPT_STOP);
/**
* 這裡還可以幫你做 Console 輸出導向工作喔!
*/
setServiceAutoDumpOut(false);
PrintStream ps = new PrintStream(new FileOutputStream("ColaService.log"));
System.setOut(ps);
/**
* 在這裡呼叫你的 Service. 可以把 args 直接傳給你程式的 Main.
*/
}
protected boolean handleStop ()
{
/**
* 這裡可以還 handle 當此 Service 被 Stop 時要做什麼事情.
*/
setStopping(5000);
return true;
}
protected boolean handleShutdown ()
{
/**
* 連關機都可以 handle 喔!
*/
return handleStop();
}
}
然後查一下 jntsvc 這個程式的使用方法:
jntsvc /OUT:SERVICE.EXE /svcmain:ServiceMain /CLASSPATH:嘿嘿嘿.EXE
"/SERVICENAME:嘿嘿嘿" "/DISPLAYNAME:嘿嘿嘿服務"
"/EVENTSOURCE:嘿嘿嘿" ServiceMain.class
可以看到 EVENTSOURCE 這個參數,
這裡還能幫你導向你的 Console Message 到 Windows NT/2000 的 Event 喔!
(使用這個功能就必須要小心丟出去的東西, 要不然三兩下就塞爆了..)
而且, 我們只要把這個程式跟服務本身分離開,
就可以讓使用者在 NT + MSJavaVM 平台使用這樣的功能,
如果是其他平台的使用者, 還是可以使用平常的啟動方式!
--
Copyright from C.....S!! :p
--
※ Origin: 鳥窩 (BirdNest.infoX.Net) ◆ From: pyrethrum.cs.nthu.edu.tw
1F:推 fbiwbi: 01/01 21:36