首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java定时器实现总结

java定时器实现总结

作者头像
编程随笔
发布2019-09-11 15:32:54
1.6K0
发布2019-09-11 15:32:54
举报
文章被收录于专栏:后端开发随笔后端开发随笔

前言:Java定时器目前主要有3种实现方式:JDK组件,Spring Task,Quartz框架。

1. JDK组件 (1) java.util.TimerTask

MyTimerTask.java:

public class MyTimerTask extends TimerTask {
  @Override
  public void run() {
    System.out.println("MyTimerTask, now: " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
  }

  public static void main(String[] args) {
    Timer timer = new Timer();
    timer.schedule(new MyTimerTask(), 1000, 1000);
    //timer.cancel(); //停止调度器
  }
}

(2) java.util.concurrent.ScheduledThreadPoolExecutor(JDK5.0+之后推荐使用)

MyScheduledTask.java:

public class MyScheduledTask implements Runnable {
  public void run() {
    System.out.println("my scheduled task, now: " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
  }
}

MyScheduledExecutor.java:

public class MyScheduledExecutor {
  public static void main(String[] args) {
    ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(10);
    ScheduledFuture future = executor.scheduleWithFixedDelay(new MyScheduledTask(), 1000, 1000, TimeUnit.MILLISECONDS);
    //future.cancel(true); // 停止定时任务,Timer不能停止定时任务,只能关闭调度器
    //executor.shutdown(); // 关闭调度器
  }
}

比较:java.util.concurrent.ScheduledThreadPoolExecutor比java.util.Timer更加灵活和高效。

2. Spring Task (1) xml配置方式实现 TaskJob.java:

@Service
public class TaskJob {
  public void job1() {
    System.out.println("指定Spring定时任务1, now: " + new SimpleDateFormat("yyy-MM-dd HH:mm:ss").format(new Date()));
  }
}

spring.xml:

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:task="http://www.springframework.org/schema/task"
...
xsi:schemaLocation="
...
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-3.0.xsd">
  <!-- 自动注入定时任务组件 -->
  <context:component-scan base-package="xxx" />

  <!-- 定义定时任务调度策略 -->
  <task:scheduled-tasks>
    <task:scheduled ref="taskJob" method="job1" cron="0/1 * * * * ?" />
  </task:scheduled-tasks>
</beans>

(2) 注解方式实现 TaskJob2.java:

@Component
public class TaskJob2 {
  /**
  * 每隔一秒执行一次
  */
  @Scheduled(cron="0/1 * * * * ?")
  public void job2() {
    System.out.println("注解方式使用spring定时任务框架, now: " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
  }
}

spring.xml:

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:task="http://www.springframework.org/schema/task"
...
xsi:schemaLocation="
...
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-3.0.xsd">
  <!-- 自动注入定时任务组件 -->
  <context:component-scan base-package="xxx" />

  <!-- 启动注解方式的定时任务 -->
  <task:annotation-driven />
</beans>

3. Quartz Quartz是一个开源的,功能非常丰富的定时器框架,详见:http://www.quartz-scheduler.org/。 Quartz可以独立使用,也可以集成在Spring框架中,详见:http://projects.spring.io/spring-framework/

(1) 独立使用Quartz(详见Quartz官方示例): pom.xml:

<dependencies>
  <dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>2.2.1</version>
  </dependency>
  <dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz-jobs</artifactId>
    <version>2.2.1</version>
  </dependency>
</dependencies>

定义定时任务,MyJob.java:

public class MyJob implements Job {
  public void execute(JobExecutionContext arg0) throws JobExecutionException {
    System.out.println("执行Quartz定时任务实现, now: " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
  }
}

调度定时任务,MyJobSheduler:

public class MyJobSheduler {
  public static void main(String[] args) {
    try {
      JobDetail job = JobBuilder.newJob(MyJob.class).withIdentity("myJob").build();
      Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1")
                .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1).repeatForever())
                .build();
      Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
      scheduler.scheduleJob(job, trigger);
      scheduler.start();
      } catch (SchedulerException e) {
        e.printStackTrace();
      }
    }
}

(2) Spring集成Quartz 如:http://docs.spring.io/spring/docs/5.0.0.M4/spring-framework-reference/htmlsingle/#scheduling-quartz

【实现比较】

实现方式

优点

缺点

JDK组件

无需引入第三方依赖,控制灵活

仅支持简单任务调度,不支持指定日期等复杂定时任务

SpringTask

功能相对JDK方式全面(简单或指定日期等复杂任务调度),支持注解和配置2种方式

Spring 3.x及以上版本才支持,详见: http://www.springframework.org/schema/task,无法灵活控制任务启动或停止

Quartz

开源,功能全面且强大(简单或指定日期等复杂任务调度),可独立使用,也可以与Spring集成 必须在项目中引入quartz依赖

在项目中必须引入quartz依赖

【使用总结】 1. J2EE项目 -- 未依赖Spring框架,建议使用Quartz。 -- 引入了Spring 3.x+,如果仅需要简单定时任务控制,建议使用Spring Task;否则建议使用Quartz。 -- 特别地,在Spring Boot项目中,根据需求可以灵活选择JDK,Spring Task或者Quartz。

2. 非J2EE项目 -- 简单定时任务控制,建议使用JDK实现:java.util.concurrent.ScheduledThreadPoolExecutor;否则建议使用Quartz。

附:在Linux环境下,可以直接使用crontab程序实现简单的定时任务,比如定时全量备份MySQL数据库。

详见:https://wiki.archlinux.org/index.php/Cron_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)

crontab在线调试工具:https://crontab.guru/

【参考】 http://gong1208.iteye.com/blog/1773177 Spring定时任务的几种实现 http://www.cnblogs.com/liuyitian/p/4108391.html Spring cron 表达式 http://blog.csdn.net/ethanzhao/article/details/4406017 Linux crontab 命令格式与详细例子

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-01-30 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档