`
oywl2008
  • 浏览: 1051637 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

jee中实现定时执行

 
阅读更多

编写一个监听器,并在web.xml中注册.
package com.backup.listener;
import java.util.Timer;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class AppListener implements ServletContextListener{
    private Timer timer=null;   
    public void contextDestroyed(ServletContextEvent event) {
        if(timer!=null){
            timer.cancel();
        }
        event.getServletContext().log("定时器销毁");
    }
    public void contextInitialized(ServletContextEvent event) {
        timer   =   new   java.util.Timer(true);     
        event.getServletContext().log("定时器已启动");
        timer.schedule(new MyTask(event.getServletContext()),0,1000);     
        event.getServletContext().log("已经添加任务调度表");
    }
}

TimerTask类:
package com.backup.listener;
import java.util.Calendar;
import java.util.Date;
import java.util.TimerTask;
import javax.servlet.ServletContext;
public class MyTask extends TimerTask {
    private static final int C_SCHEDULE_HOUR = 0;
    private static boolean isRunning = false;
    private ServletContext context = null;
    public static boolean isSunday=false;
    public MyTask(ServletContext context) {
        this.context = context;
    }
    public   void   run(){
       context.log("看一看是不是不断的执行");
           Calendar   cal   =   Calendar.getInstance();
           if(!isRunning){    
             System.err.println("开始执行任务");
               if(C_SCHEDULE_HOUR   ==   cal.get(Calendar.HOUR_OF_DAY))   {
                       isRunning   =   true;                                    
                       context.log("开始执行指定任务");    
                          
                       //TODO   添加自定义的详细任务,以下只是示例    
                       int   i   =   0;    
                       while   (i++   <   10)   {    
                               context.log("已完成任务的"   +   i   +   "/"   +   10);    
                       }    
                       isRunning  =  false;    
                       context.log("指定任务执行结束");
                   }
           }else{    
                context.log("上一次任务执行还未结束");    
           }    
     }    
}

从网上找的也不错:

web.xml

<servlet >
     <servlet-name >taskservlet</servlet-name >
    <servlet-class >common.timer.ConvergeDataServlet</servlet-class >
    <init-param >
     <param-name >startTask</param-name >
     <param-value >true</param-value >
    </init-param >
    <init-param >
     <param-name >intervalTime</param-name >
     <param-value >240</param-value >
    </init-param >
    <load-on-startup >300</load-on-startup >
</servlet >

 

ConvergeDataServlet.java

package common.timer;

import java.io.IOException;
import java.util.Timer;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class ConvergeDataServlet extends HttpServlet
{
private static final long serialVersionUID = 1L;

private Timer timer1 = null;

private Task task1;

/**  
* Constructor of the object.  
*/
public ConvergeDataServlet() {
   super();
}

/**  
* Destruction of the servlet.
*/
public void destroy() {
   super.destroy();
   if (timer1 != null) {
    timer1.cancel();
   }
}

public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {

}

public void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
   doGet(request, response);
}

// init方法启动定时器   
public void init() throws ServletException {

   ServletContext context = getServletContext();

   // (true为用定时间刷新缓存)   
   String startTask = getInitParameter("startTask");

   // 定时刷新时间(分钟)   
   Long delay = Long.parseLong(getInitParameter("intervalTime")) * 60 * 1000;
   // 启动定时器   
   if (startTask.equals("true")) {
    timer1 = new Timer(true);
    task1 = new Task(context);
    timer1.schedule(task1, delay, delay);
   }
}

}

Task.java

package common.timer;

import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.Date;
import java.util.TimerTask;
import javax.servlet.ServletContext;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import tobacco.dayreport.DayreportDAO;
import tobacco.template.service.TobaccoDAOFactory;

public class Task extends TimerTask {

private Logger logger = LogManager.getLogger(Task.class);
private ServletContext context;
private static boolean isRunning = true;

public Task(ServletContext context) {
   this.context = context;
}

public Task() {
}

@Override
public void run() {
   Date d = new Date();
   if (isRunning) {
   }
  
   DayreportDAO dao = (DayreportDAO) TobaccoDAOFactory.getDAO("Dayreport");
   try {
    Timestamp t = new Timestamp(d.getTime());
    dao.dayReports(t);
    logger.debug("=========== 汇总被执行 ==========" + d.toString());
   
   } catch (SQLException ex) {
    ex.printStackTrace();
   }

}

}

 

 

------------------------------------------------------


本例依据Java自身提供的接口实现,通过监听器(Listener)和定时器(Timer)定时执行某个任务(Task)。
专业的开源工具可参考Quartz:http://www.opensymphony.com/quartz/

MyListener:
import java.util.Timer;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class MyListener implements ServletContextListener {
  
  
private Timer timer = null;

  
public void contextInitialized(ServletContextEvent event) {
     timer
= new Timer(true);
    
//设置任务计划,启动和间隔时间
     timer.schedule(new MyTask(), 0, 86400000);
   }

  
public void contextDestroyed(ServletContextEvent event) {
     timer.cancel();
   }
  
}

MyTask:
import java.util.TimerTask;

public class MyTask extends TimerTask {

  
public void run() {
    
// System.out.println("call at " + (new Date()));
    
// TODO 此处添加具体任务代码
   }

}

web.xml配置:
<listener>
<listener-class>com.fastunit.samples.listener.MyListener</listener-class>
</listener>

 

 

来自:http://love-love-l.blog.163.com/blog/static/2107830420089151561835/

 

 

分享到:
评论

相关推荐

    java定时任务制定

    线程池调度是另一种实现定时任务的方式。Spring提供了`ThreadPoolTaskScheduler`和`ThreadPoolTaskExecutor`,它们抽象了Java 1.3到Java 5及JEE环境下的线程池实现。线程池可以有效地管理和复用线程,提高系统性能。...

    QuartzScheduler:JEE中的石英

    它允许开发者在程序中定义定时任务,从而实现自动化的工作流程,无需人工干预。Quartz的核心功能包括任务的创建、调度以及执行管理。 在JEE环境中,Quartz可以与EJB(Enterprise JavaBeans)、Servlet、JMS(Java ...

    timer随tomcat启动案例

    首先,我们要理解`Timer`类是Java.util包下的一个工具类,它提供了定时执行任务的能力。`Timer`可以安排一系列的任务(`TimerTask`)在未来某个时间点或者周期性地执行。这在需要定期执行任务的场景中非常有用,例如...

    Spring quartz

    Spring Quartz 是一个强大的任务调度框架,它允许开发者在Spring应用中灵活地定义和执行定时任务。这个框架基于开源的Quartz Scheduler,通过与Spring的集成,使得管理定时任务变得更加便捷和直观。在本文中,我们将...

    QuartzSpring

    Quartz 是一个强大的开源任务调度库,常用于Java应用程序中实现定时任务的管理。Spring框架对Quartz进行了集成,使得在Spring应用中使用Quartz变得更加方便。在Spring中使用Quartz,可以避免直接操作Quartz API,...

    JBPM4.3编程指南

    - **group定时器**:为分组内的活动设置定时器,实现定时触发。 - **group多入口**:允许同一分组下的不同活动同时执行,提高并行处理能力。 - **group同步**:确保分组内的所有活动按顺序执行,提供一致性的保障...

    javax.ejb-3.1.2.2.jar下载

    - `javax.ejb.TimerService`:提供了定时任务的管理,可以在EJB中创建和管理定时器。 描述中提到的“开发EJB项目时需要的jar包”表明了`javax.ejb-3.1.2.2.jar`对于EJB项目的必要性。在开发环境中,这个jar需要被...

    jBPM4.1中文用户手册.pdf

    - **Bpmn2.0执行**:讨论了如何在jBPM4.4中实现BPMN2.0规范。 - **配置**:介绍了配置BPMN2.0流程所需的步骤和注意事项。 - **实例**:提供了几个具体的BPMN2.0流程实例来加深理解。 - **流程根元素**:定义了BPMN...

    TongWeb6.0应用开发手册.pdf

    - 通过注解`@Schedule`定义定时任务的执行频率、开始时间等属性。 ##### 3.3 拦截器 - **拦截器**用于拦截EJB方法调用,并执行预处理或后处理逻辑。 - 可以通过注解`@Interceptor`定义拦截器类,并使用`@...

    schema.约束文件大全

    11. **Task**:在Spring中,Task模块提供了一种执行后台任务的方式,包括定时任务和异步任务。 12. **Tool**:可能是Spring的一些工具类或实用工具包,帮助开发者进行日常编码工作。 13. **Tx(Transaction)**:...

    Spring-Reference_zh_CN(Spring中文参考手册)

    6.8.1. 在Spring中使用AspectJ来为domain object进行依赖注入 6.8.1.1. @Configurable object的单元测试 6.8.1.2. 多application context情况下的处理 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来...

    spring 4.25版本 xsd文件

    开发者可以定义任务执行器、定时任务以及异步方法的配置。 9. **spring-jee.xsd**:这个文件用于集成Java企业版(Java EE)的服务,如JNDI查找、EJB调用等。它简化了在Spring应用中使用Java EE组件的过程。 10. **...

    Spring中文帮助文档

    2.2.5. 在classpath中自动搜索组件 2.3. 面向切面编程(AOP) 2.3.1. 更加简单的AOP XML配置 2.3.2. 对@AspectJ 切面的支持 2.3.3. 对bean命名pointcut( bean name pointcut element)的支持 2.3.4. 对AspectJ装载...

    D 5000(基于OpenOffice)报表安装手册.doc

    6. **编译环境安装**:eclipse-jee-indigo-linux-gtk-x86_64.tar是一个Eclipse集成开发环境(IDE)的版本,专为Java企业版(Java EE)开发设计,可用于报表系统的开发和调试,但不是必需的。 安装过程分为两个主要...

    Spring 2.0 开发参考手册

    6.8.1. 在Spring中使用AspectJ来为domain object进行依赖注入 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来配置AspectJ的切面 6.8.4. 在Spring应用中使用AspectJ Load-time weaving(LTW) 6.9. ...

    Spring API

    2.2.5. 在classpath中自动搜索组件 2.3. 面向切面编程(AOP) 2.3.1. 更加简单的AOP XML配置 2.3.2. 对@AspectJ 切面的支持 2.3.3. 对bean命名pointcut( bean name pointcut element)的支持 2.3.4. 对AspectJ装载...

    spring chm文档

    6.8.1. 在Spring中使用AspectJ来为domain object进行依赖注入 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来配置AspectJ的切面 6.8.4. 在Spring应用中使用AspectJ Load-time weaving(LTW) 6.9. ...

Global site tag (gtag.js) - Google Analytics