我们常常在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秒钟就执行一次。
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文件中增加如下一行配置:
<?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、启动web服务即可。
总结
其实实现这个功能的方法很多,我在这里是应用了ServletContextListener接口和开源api quartz,希望能对你的开发有所帮助。
|