`
kimgony
  • 浏览: 8471 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Tomcat timer 指定时间自动执行

    博客分类:
  • Java
阅读更多
想实现这样的功能:
      1.   Tomcat启动时随即启动Servlet;
      2.   Servlet启动时定时执行一个任务。

要点:
      1。Tomcat中启动Servlet时,只需要在Servlet所在的工程的配置文件web.xml中写成如下即可;
     <servlet>
          <servlet-name>TimeServlet</servlet-name>
          <servlet-class>TimeServlet</servlet-class>
          <load-on-startup>1</load-on-startup>
     </servlet>
 
     <servlet-mapping>
          <servlet-name>TimeServlet</servlet-name>
          <url-pattern>/servlet/TimeServlet</url-pattern>
     </servlet-mapping>
 

       所以最主要的是加一句:<load-on-startup>1</load-on-startup>

       2。在Servlet中写一个定时器和要执行的任务即可。
       我的Servlet叫这个名字: TimeServlet,定时输出一句话,System.out.println("____ok____");也就是用来测试一下定时任务执行情况正常而已。

import java.io.IOException;  
import java.util.Timer;  
  
import javax.servlet.ServletException;  
import javax.servlet.http.HttpServlet;  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  
  
public class TimeServlet extends HttpServlet   
{     
    private static final long serialVersionUID = 1L;  
      
    public TimeServlet()   
    {  
        super();  
    }  
      
    public void init() throws ServletException   
    {  
        Timer timer = new Timer();  
        timer.schedule(new MyTask(), 1000, 2000);// 在1秒后执行此任务,每次间隔2秒,如果传递一个Data参数,就可以在某个固定的时间执行这个任务.  
  
        // 这个是用来停止此任务的,否则就一直循环执行此任务了  
        while (true)   
        {  
            try   
            {  
                int ch = System.in.read(); //输入字符“c”,回车即停止执行  
                if (ch - 'c' == 0)   
                {  
                    timer.cancel();// 使用这个方法退出任务  
                }  
  
            } catch (IOException e)   
            {  
                e.printStackTrace();  
            }  
        }  
    }  
  
    //具体执行的任务  
    class MyTask extends java.util.TimerTask   
    {  
        public void run()   
        {  
            System.out.println("____ok____");  
        }  
    }  
      
    public void destroy()   
    {  
        super.destroy();   
    }  
  
      
    public void doGet(HttpServletRequest request, HttpServletResponse response)  
            throws ServletException, IOException   
            {  
          
    }  
  
      
    public void doPost(HttpServletRequest request, HttpServletResponse response)  
            throws ServletException, IOException   
            {  
  
    }  
}  
 


有关定时器的知识补充:
import java.io.IOException;  
import java.util.Timer;  
  
public class TimerTest   
{  
    public static void main(String[] args)   
    {  
        Timer timer = new Timer();  
        timer.schedule(new MyTask(), 1000, 2000);// 在1秒后执行此任务,每次间隔2秒,如果传递一个Data参数,就可以在某个固定的时间执行这个任务.  
  
        // 这个是用来停止此任务的,否则就一直循环执行此任务了  
        while (true)   
        {  
            try   
            {  
                int ch = System.in.read();  
                if (ch - 'c' == 0)   
                {  
                    timer.cancel();// 使用这个方法退出任务  
                }  
  
            } catch (IOException e)   
            {  
                e.printStackTrace();  
            }  
        }  
    }  
  
    static class MyTask extends java.util.TimerTask   
    {  
        public void run()   
        {  
            System.out.println("____ok____");  
        }  
    }  
}  
 
 

java定时器的使用【转载】
java定时器的使用
定时器类Timer在java.util包中。使用时,先实例化,然后使用实例的schedule(TimerTask task, long delay)方法,设定指定的任务task在指定的延迟delay后执行。定时器任务类TimerTask是抽象类,继承并重写其run()方法,可实现具体任务。
schedule(TimerTask task, Date time)设定指定任务task在指定时间time执行。
cancel()方法结束这个定时器。
schedule(TimerTask task, long delay, long period)方法设定指定任务task在指定延迟delay后进行固定延迟peroid的执行。
scheduleAtFixedRate(TimerTask task, long delay, long period)方法设定指定任务task在指定延迟delay后进行固定频率peroid的执行。
要实现一个定时任务,运用java中的Timer和TimerTask类可以非常容易实现实时调用处理函数。这两个类使用起来非常方便,可以完成我们对定时器的绝大多数需要。
看个简单的例子:
import java.io.IOException;
import java.util.Timer;
public class TimerTest {
public static void main(String[] args){
Timer timer = new Timer();
timer.schedule(new MyTask(), 1000, 2000);//在1秒后执行此任务,每次间隔2秒,如果传递一个Da<wbr>ta参数,就可以在某个固定的时间执行这个任务.</wbr>
while(true){//这个是用来停止此任务的,否则就一直循环执行此任务了
try {
int ch = System.in.read();
if(ch-'c'==0){
timer.cancel();//使用这个方法退出任务
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
static class MyTask extends java.util.TimerTask{
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println(" ");
}
}
}
 

Servlet侦听器结合Java定时器实现任务计划调度[转]
好多朋友用过Windows的任务计划,也有不少程序迷自己曾写过时钟报警、系统自动关机等趣味程序,可却很少有朋友在Web工程中实现过类似功能。今天有空把笔者先前曾在Tomcat上实现的类似功能,搬出来与大家共享。
    早在几年前,我公司跟某市财政局合作项目开发,为加强财政局对所属单位财务状况的有效监管,开发、实施了财政局数据中心项目。此项目采用B/S加C/S混合结构模式。财政局Web服务器上架设数据同步接收装置,由市属单位每天下班前把财务信息通过HTTP协议上传至财政局中心服务器,与Web服务器上的接收装置对接。财政局内部各部门需要查阅大量财务信息,获取完备的市属单位当前财务状况信息,各部门按职能划分,需要准确的获取各部门各自所关注的汇总信息,以财政报表的形式提供。
    因财政数据量大,实时计算财政报表速度较慢,当初就考虑用报表缓存来减轻服务器的负担,但用缓存需要一个合理的缓存更新机制。考虑到各市属单位每天下班前才把财务数据上传,财政局每天所查看到的财务信息其实并不包括当天(除非有某位领导等到所属单位全部上传完之后才来查看信息,应该已经下班了),所以要是能实现任务计划调度,在每晚深夜把当天及历史财务信息汇总,更新缓存,速度瓶颈不就解决了吗。
    当时由于系统核心是基于Web部署的,报表计算引擎也相应的部署在Tomcat容器上,因此如果想要借用Windows的任务计划来实现定时计算,就需要额外编写普通桌面应用程序接口,稍显复杂。于是就琢磨着想在Web上实现,经过查阅较多相关资料,发现Java定时器(java.util.Timer)有定时触发计划任务的功能,通过配置定时器的间隔时间,在某一间隔时间段之后会自动有规律的调用预先所安排的计划任务(java.util.TimerTask)。另外,由于我们希望当Web工程启动时,定时器能自动开始计时,在整个Web工程的生命期里,定时器能在每晚深夜触发一次报表计算引擎。因此定时器的存放位置也值得考查,不能简单的存在于单个Servlet或JavaBean中,必须能让定时器宿主的存活期为整个Web工程生命期,在工程启动时能自动加载运行。结合这两点,跟Servlet上下文有关的侦听器就最合适不过了,通过在工程的配置文件中加以合理配置,会在工程启动时自动运行,并在整个工程生命期中处于监听状态。
    下面就Servlet侦听器结合Java定时器来讲述整个实现过程。要运用Servlet侦听器需要实现javax.servlet.ServletContextListener接口,同时实现它的contextInitialized(ServletContextEvent event)和contextDestroyed(ServletContextEvent event)两个接口函数。考虑定时器有个建立和销毁的过程,看了前面两个接口函数,就不容置疑的把建立的过程置入contextInitialized,把销毁的过程置入contextDestroyed了。
    我把ServletContextListener的实现类取名为ContextListener,在其内添加一个定时器,示例代码如下所示(为考虑篇幅,仅提供部分代码供读者参考):
    private java.util.Timer timer = null;
    public void contextInitialized(ServletContextEvent event) {
        timer = new java.util.Timer(true);
        event.getServletContext().log("定时器已启动");        
         timer.schedule(new MyTask(event.getServletContext()), 0, 60*60*1000);
        event.getServletContext().log("已经添加任务调度表");
    }
    public void contextDestroyed(ServletContextEvent event) {
        timer.cancel();
        event.getServletContext().log("定时器销毁");
    }

    以上代码中, timer.schedule(new MyTask(event.getServletContext()), 0, 60*60*1000)这一行为定时器调度语句,其中MyTask是自定义需要被调度的执行任务(在我的财政数据中心项目中就是报表计算引擎入口),从java.util.TimerTask继承,下面会重点讲述,第三个参数表示每小时(即60*60*1000毫秒)被触发一次,中间参数0表示无延迟。其它代码相当简单,不再详细说明。
   下面介绍MyTask的实现,上面的代码中看到了在构造MyTask时,传入了javax.servlet.ServletContext类型参数,是为记录Servlet日志方便而传入,因此需要重载MyTask的构造函数(其父类java.util.TimerTask原构造函数是没有参数的)。在timer.schedule()的调度中,设置了每小时调度一次,因此如果想实现调度任务每24小时被执行一次,还需要判断一下时钟点,以常量C_SCHEDULE_HOUR表示(晚上12点,也即0点)。同时为防止24小时执行下来,任务还未执行完(当然,一般任务是没有这么长的),避免第二次又被调度以引起执行冲突,设置了当前是否正在执行的状态标志isRunning。示例代码如下所示:
    private static final int C_SCHEDULE_HOUR   = 0;
    private static boolean isRunning = false;
         private ServletContext context = null;
    public MyTask(ServletContext context) {
        this.context = context;
    }
    public void run() {
        Calendar cal = Calendar.getInstance();        
        if (!isRunning)  {           
            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("上一次任务执行还未结束");
        }
    }

    上面代码中“//TODO……”之下四行是真正被调度执行的演示代码(在我的财政数据中心项目中就是报表计算过程),您可以换成自己希望执行的语句。
到这儿,ServletContextListener和MyTask的代码都已完整了。最后一步就是把ServletContextListener部署到您的Web工程中去,在您工程的web.xml配置文件中加入如下三行:
     <listener></listener>
         <listener>com.test.ContextListener</listener>
     

    当然,上面的com.test得换成您自己的包名了。保存web.xml文件后,把工程打包部署到Tomcat中即可。任务会在每晚12点至凌晨1点之间被执行,上面的代码会在Tomcat的日志文件中记录如下:
2003-12-05 0:21:39 开始执行指定任务
2003-12-05 0:21:39 已完成任务的1/10
    ……
2003-12-05 0:21:39 已完成任务的10/10
2003-12-05 0:21:39 指定任务执行结束
分享到:
评论

相关推荐

    用JMeter来测试Tomcat的性能分享.pdf

    例如,可以添加一个Constant Throughput Timer,以确保在特定时间内保持恒定的请求数量。 4. **监听器**:监听器收集并显示测试结果,如响应时间、错误率等。你可以添加View Results Tree或聚合报告监听器,以便...

    ftp定时下载

    【Timer定时器】是Java中的一个类,位于java.util包下,它提供了一种安排在给定时间执行的任务的能力。定时器可以用来定期执行某个任务,也可以在指定延迟后执行一次。在这个FTP定时下载的实现中,Timer类被用来设定...

    web定时器组件

    它允许开发者在特定时间间隔内自动执行某些操作,例如数据同步、日志清理、发送通知等。这些任务可以是后台运行的,不会影响用户的交互体验。在本文中,我们将深入探讨Web定时器组件的概念、实现方式以及在Java中的...

    java,javaweb,spring定时器

    `@Scheduled`可以方便地在任何方法上声明,使得该方法按照指定的频率自动执行。例如: ```java import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; ...

    在WEB网站下群发邮件的例子

    4. 应用启动时自动执行任务,可以通过监听器或Spring Boot的`@PostConstruct`注解实现。 通过这些知识点,你可以构建一个在Web环境中能够自动定时群发邮件的服务,提高工作效率并确保信息的及时传达。

    dingshiqi.zip

    `@Scheduled`注解可以放在方法上,表明这个方法是一个定时任务,Spring会自动按照指定的时间间隔执行。例如: ```java import org.springframework.scheduling.annotation.Scheduled; import org.springframework....

    java定时发送邮件

    在本例中,我们可以使用`ScheduledExecutorService`,设定一个精确的时间点(如2011-8-1),让程序在指定时间执行发送邮件的操作。 如果邮件的发送依赖于某些特定的数据(如邮件内容、收件人),那么可能需要涉及...

    定时任务与cron表达式md,学习代码

    在Web开发中,Java Web应用通常运行在容器如Tomcat中。`javaweb\Tomcat.md`可能包含关于Tomcat服务器的配置、部署和优化等相关知识。而`javaweb\Cookie、Session、localStorage、sessionStorage区别和用法.md`则涉及...

    2021-2022计算机二级等级考试试题及答案No.13272.docx

    17. Java的垃圾回收机制可以自动回收不再使用的内存,但不能在指定时间释放。 18. 对于顺序存储的线性表,插入操作通常需要移动约n/2个元素。 19. 逻辑数据模型的类型包括层次模型、关系模型和网状模型。 20. ...

    Javaweb 定时器功能代码实例

    然后,我们将`MyTask`实例传递给`Timer`的`schedule()`方法,使其在指定的时间点开始执行。 最后,我们需要在`web.xml`配置文件中注册我们的监听器: ```xml &lt;!-- ... --&gt; &lt;listener-class&gt;webservice....

    Java版钉钉群定时发消息(读取本地txt)

    Java版的钉钉群定时发消息功能是一种自动化通信技术,它允许开发者利用Java编程语言编写程序,通过钉钉群内的机器人实现定期从本地TXT文件读取内容并发送到指定的钉钉群。这个功能在日常工作中可以用于定时分享信息...

    Pluto1_9_9_2.rar

    监视器实施监控:来访IP监控,来访时间监控,Get文件监控 分为绿色通过和红色报警 智能: 自动寻找可用的Web端口 自动判断文件是否存在,对文件进行分类判断和转移 自动判断是调试环境还是生成环境,使得调试...

    jmeter学习概要

    它最初被设计出来是为了评估 Tomcat 的前身 JServ 的执行效率,随着项目的成熟和发展,JMeter 的应用场景已经远远超出了最初的范围,现在它不仅用于 Web 应用的压力测试,还扩展到了其他多种类型的测试场景,包括但...

    JBPM4工作流应用开始指南.rar

    深入jPDL和jBPM Service API 201 10.1 timer(定时器)能为您做什么 201 10.1.1 持续时间表达式 202 10.1.2 工作日历 202 10.1.3 定时转移 204 10.1.4 定时事件 205 10.1.5 工作日历定时 207 10.1.6 定时重复 208 ...

    post-bumper:以特定时间间隔不断冲击给定帖子的服务

    "Post-Bumper"是一个服务,它的主要功能是在特定的时间间隔内对指定的帖子进行自动刷新或“冲击”,以此保持帖子的活跃度和可见性。这个服务可能是为了在社交媒体平台、论坛或其他在线社区中提高帖子的关注度。由于...

    【百占百胜】-三创比赛,学习定时器的心路历程and基于spring-task实现定时任务简单介绍

    4. **启动服务**:最后,启动Tomcat服务器,Spring-Task就会按照配置自动执行定时任务。 学习定时任务是一个逐步深入的过程,从基础的Timer到更高级的Spring-Task,每一步都代表着技术的演进。尽管Spring-Task在...

    EJB3.0

    定时服务允许在指定的时间间隔内执行特定的任务,适用于计划任务等场景。 ##### 4.9 安全服务 (SECURITY SERVICE) 安全服务提供了对应用的安全性管理,包括认证和授权等功能。 ##### 4.9.1 自定义安全域 可以...

    EJB3.0的学习教材

    - 定时服务允许 Bean 在指定的时间间隔后执行某个方法。 - 适用于定时任务的实现。 #### 五、消息驱动 BEAN (MESSAGE DRIVEN BEAN) - 消息驱动 Bean 是一种特殊的 EJB,用于接收来自消息中间件的消息。 - 常用于...

Global site tag (gtag.js) - Google Analytics