http://www.javaresearch.org/article/showarticle.jsp?column=2&thread=32387
摘要
我們常常在Web應(yīng)用中需要啟動(dòng)一個(gè)自己寫(xiě)的服務(wù),本文的目的是給你提供一個(gè)解決方案。
原理
本方案的原理是寫(xiě)一個(gè)實(shí)現(xiàn)了ServletContextListener接口的類,該類中有兩個(gè)方法: public void contextInitialized(ServletContextEvent sce),它是在應(yīng)用啟動(dòng)時(shí)調(diào)用;另一個(gè)方法是:public void contextDestroyed(ServletContextEvent sce),該方法是在應(yīng)用結(jié)束時(shí)調(diào)用。把我們要啟動(dòng)的后臺(tái)應(yīng)用邏輯放在contextInitialized方法中實(shí)現(xiàn);把釋放后臺(tái)應(yīng)用占用資源的工作放在contextDestroyed來(lái)處理。但我們啟動(dòng)的后臺(tái)任務(wù)常常是有要求的,比如時(shí)間,頻率等,我在這里使用了一個(gè)開(kāi)源組件:quartz。
步驟
1.寫(xiě)業(yè)務(wù)調(diào)用類:
// DumbJob.java
import org.quartz.*;
import java.util.*;
public class DumbJob implements Job {
public DumbJob() {
}
public void execute(JobExecutionContext context)
throws JobExecutionException
{
//在這里寫(xiě)業(yè)務(wù)處理代碼。什么,你不知道?那你別問(wèn)我!!:-<
}
}
本類的主要功能是由quartz中調(diào)度類按照指定的規(guī)則進(jìn)行調(diào)用執(zhí)行必要的業(yè)務(wù)邏輯。
2.寫(xiě)調(diào)度類
// TestShedule.java
import org.quartz.*;
import java.util.*;
public class TestShedule{
static SchedulerFactory schedFact = new org.quartz.impl.StdSchedulerFactory();
static Scheduler sched;
public static void run()throws Exception{
sched = schedFact.getScheduler(); //獲取調(diào)度管理器
JobDetail jobDetail = new JobDetail("myJob",
sched.DEFAULT_GROUP,
DumbJob.class);//創(chuàng)建工作
CronTrigger trigger = new CronTrigger("myTrigger","test","0/10 * * * * ?");//創(chuàng)建觸發(fā)器
sched.scheduleJob(jobDetail, trigger); //添加到調(diào)度管理器中
sched.start();//啟動(dòng)調(diào)度管理器
}
public static void stop()throws Exception{
sched.shutdown();
}
}
本類的目的是設(shè)置調(diào)用規(guī)則,在這里我用了“0/10 * * * * ?”表示每10秒鐘就執(zhí)行一次,有關(guān)表達(dá)式的說(shuō)明請(qǐng)參閱quartz的api文檔。
3.編寫(xiě)服務(wù)啟動(dòng)類:
//ServiceLoader.java
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class ServiceLoader implements ServletContextListener {
public void contextInitialized(ServletContextEvent sce) {
try{
TestShedule.run();
}catch(Exception ex){
System.out.println(ex.getMessage());
}
}
public void contextDestroyed(ServletContextEvent sce) {
try{
TestShedule.stop();
}catch(Exception ex){
System.out.println(ex.getMessage());
}
}
}
在contextInitialized中調(diào)用TestShedule.run()啟動(dòng)后臺(tái)任務(wù);在contextDestroyed中調(diào)用TestShedule.stop()停止后臺(tái)任務(wù)。
4.部署服務(wù)啟動(dòng)類
在web.xml文件中增加如下一行配置:
rootServiceLoader index.html
5.啟動(dòng)web服務(wù)即可。
總結(jié)
其實(shí)實(shí)現(xiàn)這個(gè)功能的方法很多,我在這里是應(yīng)用了ServletContextListener接口和開(kāi)源api quartz,希望能對(duì)你的開(kāi)發(fā)有所幫助。
資源
quartz: http://www.opensymphony.com/quartz
ServletContextListener在javax.servlet包中