摘要
我們常常在Web應(yīng)用中需要啟動(dòng)一個(gè)自己寫的服務(wù),本文的目的是給你提供一個(gè)解決方案。
原理
本方案的原理是寫一個(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)的后臺應(yīng)用邏輯放在contextInitialized方法中實(shí)現(xiàn);把釋放后臺應(yīng)用占用資源的工作放在contextDestroyed來處理。但我們啟動(dòng)的后臺任務(wù)常常是有要求的,比如時(shí)間,頻率等,我在這里使用了一個(gè)開源組件:quartz。
步驟
1.寫業(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
{
//在這里寫業(yè)務(wù)處理代碼。什么,你不知道?那你別問我!!:-<
}
}
本類的主要功能是由quartz中調(diào)度類按照指定的規(guī)則進(jìn)行調(diào)用執(zhí)行必要的業(yè)務(wù)邏輯。
2.寫調(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á)式的說明請參閱quartz的api文檔。
3.編寫服務(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)后臺任務(wù);在contextDestroyed中調(diào)用TestShedule.stop()停止后臺任務(wù)。
4.部署服務(wù)啟動(dòng)類
在web.xml文件中增加如下一行配置:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app id="WebApp">
<display-name>root</display-name>
<!--下邊的listener部分就是配置信息-->
<listener>
<listener-class>ServiceLoader </listener-class>
</listener>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>
5.啟動(dòng)web服務(wù)即可。
總結(jié)
其實(shí)實(shí)現(xiàn)這個(gè)功能的方法很多,我在這里是應(yīng)用了ServletContextListener接口和開源api quartz,希望能對你的開發(fā)有所幫助。