Terry.Li-彬

          虛其心,可解天下之問;專其心,可治天下之學;靜其心,可悟天下之理;恒其心,可成天下之業。

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            143 隨筆 :: 344 文章 :: 130 評論 :: 0 Trackbacks
          摘要
            
            我們常常在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文件中增加如下一行配置:
            <?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,希望能對你的開發有所幫助。
          posted on 2007-09-11 10:13 禮物 閱讀(694) 評論(0)  編輯  收藏 所屬分類: Jbpm
          主站蜘蛛池模板: 山阳县| 樟树市| 台江县| 新巴尔虎右旗| 五大连池市| 建始县| 什邡市| 临猗县| 临泽县| 林甸县| 六安市| 江华| 高密市| 揭东县| 奇台县| 和平区| 平南县| 水富县| 长宁县| 万山特区| 营山县| 色达县| 阳江市| 昌乐县| 泉州市| 靖宇县| 会宁县| 五家渠市| 石棉县| 永济市| 城步| 钟山县| 长春市| 大英县| 临漳县| 武冈市| 马龙县| 广灵县| 漳州市| 虞城县| 普定县|