java任务,java任务调度quartz

发布时间:2023-01-08

本文目录一览:

1、JAVA实现定时任务的几种方式
2、java的几种定时任务
3、Java程序员的工作职责是什么呢?
4、java每天只能执行一个任务
5、java定时任务没有执行完又到执行时间了

JAVA实现定时任务的几种方式

Java 基本的定时任务,总结方法有三种:

  1. 创建一个thread,然后让它在while循环里一直运行着,通过sleep方法来达到定时任务的效果;
  2. 用Timer和TimerTask与第一种方法相比有如下好处:
    • 当启动和去取消任务时可以控制
    • 第一次执行任务时可以指定你想要的delay时间
  3. 用ScheduledExecutorService是从的java.util.concurrent里,做为并发工具类被引进的,这是最理想的定时任务实现方式,相比于上两个方法,它有以下好处:
    • 相比于Timer的单线程,它是通过线程池的方式来执行任务的
    • 可以很灵活的去设定第一次执行任务delay时间
    • 提供了良好的约定,以便设定执行的时间间隔

java的几种定时任务

java定时任务有三种:

  • JDK自带:JDK自带的Timer以及JDK1.5+ 新增的ScheduledExecutorService;
  • Quartz:简单却强大的JAVA作业调度框架
  • Spring3.0以后自带的task:可以将它看成一个轻量级的Quartz,而且使用起来比Quartz简单许多;
    代码参考:

JDK 自带的定时器实现

schedule(TimerTask task, Date time) 特定时间执行

public static void main(String[] args) {
    for (int i = 0; i < 10; ++i) {
        new Timer("timer - " + i).schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() + " run ");
            }
        }, new Date(System.currentTimeMillis() + 2000));
    }
}

Quartz 定时器实现

2.1 通过maven引入依赖(这里主要介绍2.3.0)

注意:shiro-scheduler中依赖的是1.x版本,如果同时使用会冲突

<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>2.3.0</version>
</dependency>

2.2 创建Job类

public class TestJob implements Job {
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.println(Thread.currentThread().getName() + " test job begin " + DateUtil.getCurrentTimeStr());
    }
}

2.3 调度任务

public static void main(String[] args) throws InterruptedException, SchedulerException {
    Scheduler scheduler = new StdSchedulerFactory().getScheduler();
    // 开始
    scheduler.start();
    // job 唯一标识 test.test-1
    JobKey jobKey = new JobKey("test", "test-1");
    JobDetail jobDetail = JobBuilder.newJob(TestJob.class).withIdentity(jobKey).build();
    Trigger trigger = TriggerBuilder.newTrigger()
        .withIdentity("test", "test")
        // 延迟一秒执行
        .startAt(new Date(System.currentTimeMillis() + 1000))
        // 每隔一秒执行 并一直重复
        .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1).repeatForever())
        .build();
    scheduler.scheduleJob(jobDetail, trigger);
    Thread.sleep(5000);
    // 删除job
    scheduler.deleteJob(jobKey);
}

3. Spring 相关的任务调度

3.1 配置文件实现

spring-schedule.xml

<task:scheduler id="myScheduler" pool-size="10" />
<task:scheduled-tasks scheduler="myScheduler">
    <task:scheduled ref="job" method="test" cron="0 * * * * ?"/>
</task:scheduled-tasks>

3.2 注解实现

spring-schedule.xml

<task:scheduler id="myScheduler" pool-size="10" />
<!-- 启用注解 -->
<task:annotation-driven scheduler="myScheduler"/>
@Component
public class Task {
    @Scheduled(cron="0/5 * * * * ? ") //每5秒执行一次
    public void execute() {
        DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println(sdf.format(DateTime.now().toDate())+"*********B任务每5秒执行一次进入测试");
    }
}

Java程序员的工作职责是什么呢?

java程序员每天要做的主要有:需求分析、框架选型、编码、测试、改bug等。

  1. 需求分析
    在接到开发任务时,java程序员首先要对这个任务进行需求分析,了解时间节点、任务目标、需要什么元素等等,梳理好工作流程之后再开始进行开发工作。
  2. 框架选择
    在开始编程之前还需要先调研有哪些工具或者框架可以来做这个事,分别有哪些优缺点,针对自己的项目,哪个比较合适一些,甚至可以写个demo来试看看是否有什么问题。
  3. 编码
    准备工作都做好后就要开始编程开发了,java程序员每天大部分时间都被用来编程。
  4. 测试并改bug
    程序编写好后需要程序员做初步的测试看看程序能不能跑起来同时生产程序在跑的过程中,可能会出现各种各样的异常,如果有问题需要程序员及时查看日志,查问题,解决问题。

java每天只能执行一个任务

一、用java.util.Timer

使用JAVA类Timer可实现简单的延迟和周期性任务,其中的任务使用java.util.TimerTask表示。任务的执行方式有两种:

  • 按固定速率执行:即scheduleAtFixedRate的两个重载方法
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
    @Override
    public void run() {
        System.out.println("Timer is running");
    }
}, 2000, 5000);
  • 按固定延迟执行:即schedule的4个重载方法
Timer timer = new Timer();
timer.schedule(new TimerTask() {
    @Override
    public void run() {
        System.out.println("Timer is running");
    }
}, 2000);

我们要实现一个定时任务,只需要实现TimerTask的run方法即可。每一个任务都有下一次执行时间nextExecutionTime(毫秒),如果是周期性的任务,那么每次执行都会更新这个时间为下一次的执行时间,当nextExecutionTime小于当前时间时,都会执行它。

Timer的缺陷

  1. 由于执行任务的线程只有一个,所以如果某个任务的执行时间过长,那么将破坏其他任务的定时精确性。如一个任务每1秒执行一次,而另一个任务执行一次需要5秒,那么如果是固定速率的任务,那么会在5秒这个任务执行完成后连续执行5次,而固定延迟的任务将丢失4次执行。
  2. 如果执行某个任务过程中抛出了异常,那么执行线程将会终止,导致Timer中的其他任务也不能再执行。
  3. Timer使用的是绝对时间,即是某个时间点,所以它执行依赖系统的时间,如果系统时间修改了的话,将导致任务可能不会被执行。

二、使用ScheduledThreadPoolExecutor

由于Timer存在上面说的这些缺陷,在JDK1.5中,我们可以使用ScheduledThreadPoolExecutor来代替它,使用Executors.newScheduledThreadPool工厂方法或使用ScheduledThreadPoolExecutor的构造函数来创建定时任务,它是基于线程池的实现,不会存在Timer存在的上述问题,当线程数量为1时,它相当于Timer。

ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
scheduledThreadPool.schedule(new Runnable() {
    public void run() {
        System.out.println("delay 3 seconds");
    }
}, 3, TimeUnit.SECONDS);
scheduledThreadPool.scheduleAtFixedRate(() -> 
    System.out.println("delay 1 seconds, and excute every 3 seconds"),
    1, 3, TimeUnit.SECONDS);

java定时任务没有执行完又到执行时间了

代码错误。多数是代码错误导致java定时任务没有执行完又到执行时间了。

  1. 首先打开java检查代码是否错误。
  2. 其次打开网络诊断器进行测试网络连接是否异常。
  3. 最后点击重新运行java即可。