我們常常在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,希望能對你的開發有所幫助。