`

定时器的实现,java定时器Timer和Quartz的比较

 
阅读更多
这是学习定时器找到的第二篇文章
地址:http://blog.csdn.net/zlxdream815/article/details/8177574

timer定时器。(这个比较简单,timer是java.util包下一个类)
为了更好的了解,写了如下例子

public class MyTask extends TimerTask{
            int count = 0; 
 public void run() {
          System.out.println("定时器TimerTask启动"+count);
         count++;
       }

}


public class MyTaskB extends TimerTask{
           int count = 0; 
 public void run() {
         System.out.println("定时器MyTaskB启动"+count);
        count++;
     }
}


在main方法中测试
Timer timer=new Timer();
/**
     * 定时器任务制定,执行
     * @param tag: 0.在指定的时间里,执行指定的任务;
     *             1.在指定的时间里,按照指定的延迟,重复执行指定任务;
     *             2.从指定的延迟后,执行指定任务;
     *             3.从指定的延迟后,按照指定的延迟,重复执行指定的任务。
     *            
     * @param mydate:指定的执行时间。只有在tag等于0、1才需要指定。           
     * @param delay: 延迟执行时间,毫秒数。只有在tag等于1、3才需要指定。
     * @param period:间隔执行时间,毫秒数。只有在tag等于4才需要指定。
     */

    
   
//定时器,执行任务测试 
    public static void main(String[] args) {   
     new TestA().timer.schedule(new MyTask(), 1000);
        new TestA().timer.schedule(new MyTaskB(), 4000);
    } 


注:timer还可以在web中应用。直接把MyTask()和MyTaskB()里面的方法作修改即可,也可以在任务完成后关掉timer定时。
总结:其实timer实现定时任务是很简单的,但是在想法开发是很少用到timer,而是用spring的Quartz。我也在网上找到了一些资料,现在总结一下。
1. Java定时器没有持久化机制。
2. Java定时器的日程管理不够灵活(只能设置开始时间、重复的间隔,设置特定的日期、时间等)//这点感同身受
3. Java定时器没有使用线程池(每个Java定时器使用一个线程)//想必在用timer是遇到了吧。
4. Java定时器没有切实的管理方案,你不得不自己完成存储、组织、恢复任务的措施

一下例子是我在myeclipse中创建了一个小项目,仅供参考。

第一步建立web项目(省略)

第二步导入必要包:如下
用到了一下包:
(这九个包我就不多说了,想必大家都知道他的用处。)
第三步:配置相关文件。web.xml、quartz.properties、quartz_job.xml这三个文件。这里我就没用spring的applicationContext.xml文件来管理了。其实原理都是一样,都是在web启动时监听并启动定时器。配置spring的quartz定时器有两种方法,一种是你用quartz.properties、quartz_job.xml,另外一种是用spring的applicationContext.xml。其实在开发的时候我还是比较喜欢前面一种,因为简单、方便,而用spring的applicationContext.xml里面本来就有各种配置,各种注入,是文件不够清晰(个人见解。呵呵)
(项目中文件的位置,直接放在src目录下)
第四步:web.xml文件配置(监听和启动定时器)

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
 xmlns="http://java.sun.com/xml/ns/j2ee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
 http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
 
  <listener>
  <listener-class>
   org.quartz.ee.servlet.QuartzInitializerListener
  </listener-class>
 </listener>
 
 <!--  timer -->
 <context-param>
  <param-name>config-file</param-name>
  <param-value>/quartz.properties</param-value>
 </context-param>
 
 <context-param>
  <param-name>shutdown-on-unload</param-name>
  <param-value>true</param-value>
 </context-param>
 
 
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>


第五步:配置quartz.properties文件

org.quartz.scheduler.instanceName = TestScheduler
org.quartz.scheduler.instanceId = one

org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 2
org.quartz.threadPool.threadPriority = 4

org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.JobInitializationPlugin
org.quartz.plugin.jobInitializer.fileName = quartz_job.xml


注解:主要主用是启动quartz_job.xml。其余的都是一些配置性能的属性,可以在网上查看。
第六步:配置quartz_job.xml(里面主要配置定时器的一下属性)


<?xml version="1.0" encoding="GBK"?>
<quartz>
<!-- 每1分钟执行一次 -->
 <job>
  <job-detail>
   <name>getDate</name><!-- 表示目标定时器的方法(也就是这个方法要定时的作用)-->
   <group>job</group>
   <job-class>com.timer.util.TimerTask</job-class><!-- 表示上面的getDate()方法路径(即所在的包)-->
  </job-detail>
  <trigger>
   <cron>
    <name>t1</name>
    <group>job</group>
    <job-name>getDate</job-name>
    <job-group>job</job-group>
    <cron-expression>0 0/1 * * * ?</cron-expression><!-- 设置定时器的触发时间即间隔时间(参数形式可以在网上查到自己想要的形式)-->
   </cron>
  </trigger>
 </job>

</quartz>


第七步:写用两个类来测试定时器是否好用。

public class TimerTask implements Job {

 private static Logger logger = Logger.getLogger(TimerTask.class);

    public void execute(JobExecutionContext arg0) throws JobExecutionException {
        try {
         TimerOperation.getDate();
        } catch (Exception ex) {
            logger.info(ex.getMessage());
        }
    }

}

public class TimerOperation {
 private static Logger logger = Logger.getLogger(TimerOperation.class);
 public static void getDate()
 {
  String strCurrentDateTime = "";
        Date currentDateTime = new Date();
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        strCurrentDateTime = formatter.format(currentDateTime);
        logger.info("定时器启动"+strCurrentDateTime);
 }
}


写这两个类就会看出,定时器不能直接调用自己写了定时方法,要先写一个类实现job的接口,然后在实现接口的execute()方法里面调用自己事先写好的定时任务。
好了一个定时器就写好了。运行项目,等待一分钟控制台就会出现
分享到:
评论

相关推荐

    Spring定时器实例(Java的Timer类和OpenSymphony的Quartz)

    Spring两种定时器实例配置:Java的TimerTask类和OpenSymphony的Quartz。包含5种配置方式:timer普通定时器、timer特定方法定时器、quartz简单定时器、quartz精确定时器、quartz特定方法定时器。简单实用,一看就会。

    spring定时器 Spring定时器的两种实现方式Java的Timer类和OpenSymphony的Quartz。

    spring定时器Spring定时器的两种实现方式Java的Timer类和OpenSymphony的Quartz。

    Timer、Quartz定时详细分析与代码实例

    该文档经过本人详细整理,jdk Timer、spring quartz定时器的详细对比及代码实例,代码拷贝到程序中就可以运行,经过自己验证。

    java 定时器任务timer 随tomcat启动而启动 同步启动

    我们通常写的timer都是用main方法写的定时器,但同样我们也需要根据服务器启动后定时器也启动的 定时执行任务。不过有个致命伤就是集群方面跟quartz不能比,此方法代码做参考不错,如果要用,那么这个方法在一台...

    quartz 和 Timer实现定时功能

    quartz和Timer的demo中没有用框架,很简单的例子,主要用于测试用的...

    JAVA中 Spring定时器的两种实现方式

    本文向您介绍Spring定时器的两种实现方式,包括Java Timer定时和Quartz定时器,两种Spring定时器的实现方式各有优点,可结合具体项目考虑是否采用。

    SPRING 定时器的使用

    并非应用系统中发生的所有事情都是由用户的动作引起的。...在Spring中有两种流行配置:Java的Timer类和OpenSymphony的Quartz来执行调度任务。下面以给商丘做的接口集抄900到中间库的日冻结数据传输为例:

    spring 定时器

    spring-2.0.6.jar Spring框架的核心包 ...quartz-1.6.0.jar 会用到CronTrigger这个类,通过表达式实现精确的定时 commons-logging-1.1.1.jar 日志管理包 commons-collections-3.2.1.jar 集合工具包

    spring定时器

    Spring定时器在SSH框架中的应用,Java的Timer类和OpenSymphony的Quartz来执行调度任务

    关于quartz的demo

    Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,完全由Java开发,可以用来执行定时任务,类似于java.util.Timer。但是相较于Timer, Quartz增加了很多功能: 持久性作业 - 就是保持调度定时的...

    详解免费开源的DotNet任务调度组件Quartz.NET(.NET组件介绍之五)

    很多的软件项目中都会使用到定时任务、定时轮询数据库同步,定时邮件...如果需要在.NET实现定时器的功能,可以尝试使用以下这款开源免费的组件Quartz.Net组件。目前Quartz.NET版本为3.0,修改了原来的一些问题:修复

    quartz 定时任务

    spring+quartz demo 源码送上很好用,下载之后就可以运行,例子很好看懂的,里面还有timer定时器的一些佩法

    java 中Spring task定时任务的深入理解

    java 中Spring task定时任务的深入理解 ...同时,spring还支持使用Java自带的Timer定时器和Quartz定时框架。限于篇幅,这里将只介绍spring task的使用。 其实,官方文档已经介绍地足够详细,只不过都是英

    .net core 定时任务

    .net core 定时执行某一时间的任务,可设置循环的小时,分钟,秒, 资源里只执行了一次定时任务,可循环多次,运行时自动进入方法

    camel集成spring的各种案例

    如:jetty、file、activemq、ftp、http、log、并行、分支、发送邮件、接收邮件、seda队列、timer定时器、netty4、quartz2定时器、zookeeper操作,只是简单案例,方便学习, 适合入门和研究camel。不喜勿喷...

    AspNet Core上实现web定时任务实例

    作为一枚后端程序狗,项目实践... ①.AspNetCore自带的HostService, 这是一个轻量级的后台服务, 需要搭配timer完成定时任务 ②.老牌Quartz.Net组件,支持复杂灵活的Scheduling、支持ADO/RAM Job任务存储、支持集群、

    SomeJava:将以往项目应用中各种框架、中间件的使用方式抽取出来,希望以后给刚接触直接运行,入门参考。。

    帮别人弄的一个框架Demo、基于maven构建、采用springMvc+springJdbc,特点是web层和service层分离,采用hessian实现远程交互,这样web和service可以分开部署,中间用代理服务器转发,实现一台web多个service节点提供...

Global site tag (gtag.js) - Google Analytics