看板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