UML软件工程组织

如何在Web应用中启动后台任务的实例讲解
来 源: Java研究组织 作者:gagaghost
我们常常在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,希望能对你的开发有所帮助。

 

版权所有:UML软件工程组织