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
          主站蜘蛛池模板: 桃源县| 本溪| 阿巴嘎旗| 镇原县| 安丘市| 得荣县| 驻马店市| 洪江市| 鲜城| 平安县| 洛浦县| 应城市| 白朗县| 赫章县| 扶沟县| 金川县| 临潭县| 卢湾区| 石家庄市| 木里| 延津县| 台前县| 仙桃市| 得荣县| 天等县| 九龙城区| 满城县| 仙居县| 上虞市| 萍乡市| 胶南市| 宿迁市| 富阳市| 城步| 玉屏| 宜宾县| 大宁县| 乃东县| 晋江市| 涟水县| 巴南区|