http://www.javaresearch.org/article/showarticle.jsp?column=2&thread=32387
摘要
我们常常在Web应用中需要启动一个自己写的服务,本文的目的是给你提供一个解决方案。
原理
本方案的原理是写一个实现了ServletContextListener接口的类,该类中有两个方法: public void contextInitialized(ServletContextEvent sce),它是在应用启动时调用;另一个方法是:public void contextDestroyed(ServletContextEvent sce),该方法是在应用结束时调用。把我们要启动的后台应用逻辑放在contextInitialized方法中实现;把释放后台应用占用资源的工作放在contextDestroyed来处理。但我们启动的后台任务常常是有要求的,比如时间,频率等,我在这里使用了一个开源组件:quartz。
步骤
1.写业务调用类:
// DumbJob.java
import org.quartz.*;
import java.util.*;
public class DumbJob implements Job {
public DumbJob() {
}
public void execute(JobExecutionContext context)
throws JobExecutionException
{
//在这里写业务处理代码。什么,你不知道?那你别问我!!:-<
}
}
本类的主要功能是由quartz中调度类按照指定的规则进行调用执行必要的业务逻辑。
2.写调度类
// 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(); //获取调度管理器
JobDetail jobDetail = new JobDetail("myJob",
sched.DEFAULT_GROUP,
DumbJob.class);//创建工作
CronTrigger trigger = new CronTrigger("myTrigger","test","0/10 * * * * ?");//创建触发器
sched.scheduleJob(jobDetail, trigger); //添加到调度管理器中
sched.start();//启动调度管理器
}
public static void stop()throws Exception{
sched.shutdown();
}
}
本类的目的是设置调用规则,在这里我用了“0/10 * * * * ?”表示每10秒钟就执行一次,有关表达式的说明请参阅quartz的api文档。
3.编写服务启动类:
//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中调用TestShedule.run()启动后台任务;在contextDestroyed中调用TestShedule.stop()停止后台任务。
4.部署服务启动类
在web.xml文件中增加如下一行配置:
rootServiceLoader index.html
5.启动web服务即可。
总结
其实实现这个功能的方法很多,我在这里是应用了ServletContextListener接口和开源api quartz,希望能对你的开发有所帮助。
资源
quartz: http://www.opensymphony.com/quartz
ServletContextListener在javax.servlet包中