JAVA学习网首页 把生活查询网加入收藏 把JAVA学习网设为首页 联系方式
    Hi,JAVA学习
JAVA基础 设计模式 数据库 JavaBeans J2EE JavaDelphi 用户界面 综合文章  
如何在Web应用中启动后台任务
时间:22/04/2007
作者:网络
来源:网络
小提示点这里把文章加入您的收藏夹,方便下次查看
设置文章字体大小:[ ]
摘要
  我们常常在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,希望能对你的开发有所帮助。 
资源
quartz:  http://www.opensymphony.com/quartz
ServletContextListener在javax.servlet包中

作者
  郭建东    Email:gagaghost@gmail.com    msn:gagaghost@hotmail.com

上一篇:如何处理大数据量的查询

下一篇:Apache通用日志包概述

  • 一个J2ME俄罗斯方块游戏的设计与改良
  • JAVA的学习体会
  • JDBC Connection Pool
  • Stryon'siNET(.NET-iNET-J2EE)测试者邀请。
  • 使用java.util.Timer
  • Java中涉及byte、short和char类型的运算操作
  • 闲来无事,写了个删除文件夹的java类
  • 学习使用J2EE Web应用的事件功能
  • javac-----Java编程语言编译器
  • 自己写的一个JSP小游戏21点,记录一下
  • Java远程方法调用4
  • JdonJive论坛系统完整分析(7)
  • 将Java image对象转换成PNG格式字节数组
  • java日期格式化
  • 用Java简单实现文件分割与合并
  • Apache下 配置WAP + OTA方法
  • 对项目开发中几种测试类型的理解和实操
  • java编辑多语言的福音--推荐一个经典的多语言文件编辑的插件ResourceBundle Editor
  • 返回】 【顶部】 【关闭
    Copyright © 2005-2010 www.594k.com All Rights Reserved.
    版权所有:JAVA学习网 备案序号:皖ICP备06004238号