- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章java Quartz定时器任务与Spring task定时的几种实现方法由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
一.分类 。
从实现的技术上来分类,目前主要有三种技术(或者说有三种产品):
1.Java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务。使用这种方式可以让你的程序按照某一个频度执行,但不能在指定时间运行。一般用的较少,这篇文章将不做详细介绍.
2.使用Quartz,这是一个功能比较强大的的调度器,可以让你的程序在指定时间执行,也可以按照某一个频度执行,配置起来稍显复杂,稍后会详细介绍.
3.Spring3.0以后自带的task,可以将它看成一个轻量级的Quartz,而且使用起来比Quartz简单许多,稍后会介绍.
从作业类的继承方式来讲,可以分为两类:
1.作业类需要继承自特定的作业类基类,如Quartz中需要继承自org.springframework.scheduling.quartz.QuartzJobBean;java.util.Timer中需要继承自java.util.TimerTask.
2.作业类即普通的java类,不需要继承自任何基类.
注:个人推荐使用第二种方式,因为这样所以的类都是普通类,不需要事先区别对待.
从任务调度的触发时机来分,这里主要是针对作业使用的触发器,主要有以下两种:
1.每隔指定时间则触发一次,在Quartz中对应的触发器为:org.springframework.scheduling.quartz.SimpleTriggerBean 。
2.每到指定时间则触发一次,在Quartz中对应的调度器为:org.springframework.scheduling.quartz.CronTriggerBean 。
注:并非每种任务都可以使用这两种触发器,如java.util.TimerTask任务就只能使用第一种。Quartz和spring task都可以支持这两种触发条件.
二.用法说明 。
详细介绍每种任务调度工具的使用方式,包括Quartz和spring task两种.
Quartz 。
第一种,作业类继承自特定的基类:org.springframework.scheduling.quartz.QuartzJobBean.
第一步:定义作业类 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
import
org.quartz.JobExecutionContext;
import
org.quartz.JobExecutionException;
import
org.springframework.scheduling.quartz.QuartzJobBean;
public
class
Job1
extends
QuartzJobBean {
private
int
timeout;
private
static
int
i =
0
;
//调度工厂实例化后,经过timeout时间开始执行调度
public
void
setTimeout(
int
timeout) {
this
.timeout = timeout;
}
/**
* 要调度的具体任务
*/
@Override
protected
void
executeInternal(JobExecutionContext context)
throws
JobExecutionException {
System.out.println(
"定时任务执行中…"
);
}
}
|
第二步:spring配置文件中配置作业类JobDetailBean 。
1
2
3
4
5
6
7
8
|
<
bean
name
=
"job1"
class
=
"org.springframework.scheduling.quartz.JobDetailBean"
>
<
property
name
=
"jobClass"
value
=
"com.gy.Job1"
/>
<
property
name
=
"jobDataAsMap"
>
<
map
>
<
entry
key
=
"timeout"
value
=
"0"
/>
</
map
>
</
property
>
</
bean
>
|
说明:org.springframework.scheduling.quartz.JobDetailBean有两个属性,jobClass属性即我们在java代码中定义的任务类,jobDataAsMap属性即该任务类中需要注入的属性值.
第三步:配置作业调度的触发方式(触发器) 。
Quartz的作业触发器有两种,分别是 。
org.springframework.scheduling.quartz.SimpleTriggerBean 。
org.springframework.scheduling.quartz.CronTriggerBean 。
第一种SimpleTriggerBean,只支持按照一定频度调用任务,如每隔30分钟运行一次.
配置方式如下:
1
2
3
4
5
|
<
bean
id
=
"simpleTrigger"
class
=
"org.springframework.scheduling.quartz.SimpleTriggerBean"
>
<
property
name
=
"jobDetail"
ref
=
"job1"
/>
<
property
name
=
"startDelay"
value
=
"0"
/>
<!-- 调度工厂实例化后,经过0秒开始执行调度 -->
<
property
name
=
"repeatInterval"
value
=
"2000"
/>
<!-- 每2秒调度一次 -->
</
bean
>
|
第二种CronTriggerBean,支持到指定时间运行一次,如每天12:00运行一次等.
配置方式如下:
1
2
3
4
5
|
<
bean
id
=
"cronTrigger"
class
=
"org.springframework.scheduling.quartz.CronTriggerBean"
>
<
property
name
=
"jobDetail"
ref
=
"job1"
/>
<!—每天12:00运行一次 -->
<
property
name
=
"cronExpression"
value
=
"0 0 12 * * ?"
/>
</
bean
>
|
第四步:配置调度工厂 。
1
2
3
4
5
6
7
|
<
bean
class
=
"org.springframework.scheduling.quartz.SchedulerFactoryBean"
>
<
property
name
=
"triggers"
>
<
list
>
<
ref
bean
=
"cronTrigger"
/>
</
list
>
</
property
>
</
bean
>
|
说明:该参数指定的就是之前配置的触发器的名字.
第五步:启动你的应用即可,即将工程部署至tomcat或其他容器.
第二种,作业类不继承特定基类.
Spring能够支持这种方式,归功于两个类:
1
2
3
|
org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean
org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean
|
这两个类分别对应spring支持的两种实现任务调度的方式,即前文提到到java自带的timer task方式和Quartz方式。这里我只写MethodInvokingJobDetailFactoryBean的用法,使用该类的好处是,我们的任务类不再需要继承自任何类,而是普通的pojo.
第一步:编写任务类 。
1
2
3
4
5
|
public
class
Job2 {
public
void
doJob2() {
System.out.println(
"不继承QuartzJobBean方式-调度进行中..."
);
}
}
|
可以看出,这就是一个普通的类,并且有一个方法.
第二步:配置作业类 。
1
2
3
4
5
6
7
8
|
<
bean
id
=
"job2"
class
=
"org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"
>
<
property
name
=
"targetObject"
>
<
bean
class
=
"com.gy.Job2"
/>
</
property
>
<
property
name
=
"targetMethod"
value
=
"doJob2"
/>
<
property
name
=
"concurrent"
value
=
"false"
/>
<!-- 作业不并发调度 -->
</
bean
>
|
说明:这一步是关键步骤,声明一个MethodInvokingJobDetailFactoryBean,有两个关键属性:targetObject指定任务类,targetMethod指定运行的方法。往下的步骤就与方法一相同了,为了完整,同样贴出.
第三步:配置作业调度的触发方式(触发器) 。
Quartz的作业触发器有两种,分别是 。
1
2
3
|
org.springframework.scheduling.quartz.SimpleTriggerBean
org.springframework.scheduling.quartz.CronTriggerBean
|
第一种SimpleTriggerBean,只支持按照一定频度调用任务,如每隔30分钟运行一次.
配置方式如下:
1
2
3
4
5
|
<
bean
id
=
"simpleTrigger"
class
=
"org.springframework.scheduling.quartz.SimpleTriggerBean"
>
<
property
name
=
"jobDetail"
ref
=
"job2"
/>
<
property
name
=
"startDelay"
value
=
"0"
/>
<!-- 调度工厂实例化后,经过0秒开始执行调度 -->
<
property
name
=
"repeatInterval"
value
=
"2000"
/>
<!-- 每2秒调度一次 -->
</
bean
>
|
第二种CronTriggerBean,支持到指定时间运行一次,如每天12:00运行一次等.
配置方式如下:
1
2
3
4
5
|
<
bean
id
=
"cronTrigger"
class
=
"org.springframework.scheduling.quartz.CronTriggerBean"
>
<
property
name
=
"jobDetail"
ref
=
"job2"
/>
<!—每天12:00运行一次 -->
<
property
name
=
"cronExpression"
value
=
"0 0 12 * * ?"
/>
</
bean
>
|
以上两种调度方式根据实际情况,任选一种即可.
第四步:配置调度工厂 。
1
2
3
4
5
6
7
|
<
bean
class
=
"org.springframework.scheduling.quartz.SchedulerFactoryBean"
>
<
property
name
=
"triggers"
>
<
list
>
<
ref
bean
=
"cronTrigger"
/>
</
list
>
</
property
>
</
bean
>
|
说明:该参数指定的就是之前配置的触发器的名字.
第五步:启动你的应用即可,即将工程部署至tomcat或其他容器。 。
到此,spring中Quartz的基本配置就介绍完了,当然了,使用之前,要导入相应的spring的包与Quartz的包,这些就不消多说了.
其实可以看出Quartz的配置看上去还是挺复杂的,没有办法,因为Quartz其实是个重量级的工具,如果我们只是想简单的执行几个简单的定时任务,有没有更简单的工具,有! 。
Spring-Task 。
本文介绍Spring3.0以后自主开发的定时任务工具,spring task,可以将它比作一个轻量级的Quartz,而且使用起来很简单,除spring相关的包外不需要额外的包,而且支持注解和配置文件两种 。
形式,下面将分别介绍这两种方式.
第一种:配置文件方式 。
第一步:编写作业类 。
即普通的pojo,如下: 。
1
2
3
4
5
6
7
8
|
import
org.springframework.stereotype.Service;
@Service
public
class
TaskJob {
public
void
job1() {
System.out.println(“任务进行中。。。”);
}
}
|
第二步:在spring配置文件头中添加命名空间及描述 。
1
2
3
4
|
<
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"
>
|
第三步:spring配置文件中设置具体的任务 。
1
2
3
4
5
|
<
task:scheduled-tasks
>
<
task:scheduled
ref
=
"taskJob"
method
=
"job1"
cron
=
"0 * * * * ?"
/>
</
task:scheduled-tasks
>
<
context:component-scan
base-package
=
" com.gy.mytask "
/>
|
说明:ref参数指定的即任务类,method指定的即需要运行的方法,cron及cronExpression表达式,具体写法这里不介绍了,详情见上篇文章附录.
<context:component-scan base-package="com.gy.mytask" />这个配置不消多说了,spring扫描注解用的.
到这里配置就完成了,是不是很简单.
第二种:使用注解形式 。
也许我们不想每写一个任务类还要在xml文件中配置下,我们可以使用注解@Scheduled,我们看看源文件中该注解的定义: 。
1
2
3
4
5
6
7
8
9
10
11
|
@Target
({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.ANNOTATION_TYPE})
@Retention
(RetentionPolicy.RUNTIME)
@Documented
public
@interface
Scheduled
{
public
abstract
String cron();
public
abstract
long
fixedDelay();
public
abstract
long
fixedRate();
}
|
可以看出该注解有三个方法或者叫参数,分别表示的意思是:
cron:指定cron表达式 。
fixedDelay:官方文档解释:An interval-based trigger where the interval is measured from the completion time of the previous task. The time unit value is measured in milliseconds.即表示从上一个任务完成开始到下一个任务开始的间隔,单位是毫秒.
fixedRate:官方文档解释:An interval-based trigger where the interval is measured from the start time of the previous task. The time unit value is measured in milliseconds.即从上一个任务开始到下一个任务开始的间隔,单位是毫秒.
下面我来配置一下.
第一步:编写pojo 。
1
2
3
4
5
6
7
8
9
10
|
import
org.springframework.scheduling.annotation.Scheduled;
import
org.springframework.stereotype.Component;
@Component
(“taskJob”)
public
class
TaskJob {
@Scheduled
(cron =
"0 0 3 * * ?"
)
public
void
job1() {
System.out.println(“任务进行中。。。”);
}
}
|
第二步:添加task相关的配置: 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
<?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
<
beans
xmlns
=
"http://www.springframework.org/schema/beans"
xmlns:xsi
=
"http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop
=
"http://www.springframework.org/schema/aop"
xmlns:context
=
"http://www.springframework.org/schema/context"
xmlns:tx
=
"http://www.springframework.org/schema/tx"
xmlns:task
=
"http://www.springframework.org/schema/task"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd"
default-lazy-init
=
"false"
>
<
context:annotation-config
/>
<!—spring扫描注解的配置 -->
<
context:component-scan
base-package
=
"com.gy.mytask"
/>
<!—开启这个配置,spring才能识别@Scheduled注解 -->
<
task:annotation-driven
scheduler
=
"qbScheduler"
mode
=
"proxy"
/>
<
task:scheduler
id
=
"qbScheduler"
pool-size
=
"10"
/>
|
说明:理论上只需要加上<task:annotation-driven />这句配置就可以了,这些参数都不是必须的.
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.
原文链接:http://www.cnblogs.com/chen-lhx/p/5581129.html 。
最后此篇关于java Quartz定时器任务与Spring task定时的几种实现方法的文章就讲到这里了,如果你想了解更多关于java Quartz定时器任务与Spring task定时的几种实现方法的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我对开发领域有点陌生,我正在开发一个 Android 项目。我正在尝试使用手机相机闪光灯。我试图让它以重复的 Action 闪烁。下面是我的 .java 文件中的一个剪辑。 public vo
我正在制作一个 ios 应用程序,它是一种诗集。我想要的功能之一是定时“阅读”,因此一首诗中的单词出现的时间与我阅读时的时间相同。所以我有一个数组,里面有诗中的词,还有延迟。 现在我想遍历单词,在屏幕
这个问题在这里已经有了答案: Loop doesn't see value changed by other thread without a print statement (1 个回答) 关闭
我如何才能使用计时器?例如,我想显示某个文本 10 秒,然后我想在剩余时间内显示不同的文本。 谢谢 凯文 最佳答案 延迟操作的最简单方法是使用 NSObject 的 PerformSelector:w
我在这里的措辞上有点困难,但要点是我使用返回一个对象的 Promise.race (如下所示)。大多数时候,至少有一些 promise 会崩溃,但这是故意的。这仅意味着未找到产品。为了避免 Promi
我正在寻找定时 JDialog,它会在指定时间过后消失,并且找到的代码运行正常。 JFrame f = new JFrame(); final JDia
我试图让选择器在不同的时间轮换,我想我会尝试一个简单的 if/else 语句,让第一个选择器在 3 秒后轮换,接下来的选择器在 30 秒后轮换。然而,它只是每三秒旋转一次。如果我想出了如何完成这项工作
这个问题已经有答案了: How to implement a timer in c? (7 个回答) Creating a Timer in C (2 个回答) 已关闭 9 年前。 我需要根据用户输入
我有一个在我文档的 head 标签中调用的 javascript 文件,每隔 30 秒,我希望重新加载这个 javascript 文件。 我对此做了一些研究,似乎它在提取本地存储的文件副本或跨浏览器问
我想看看运行 bash 函数需要多长时间。在做了一些研究之后,我想出了这种使用子 shell 的方法: function test-function() { time ( rs
我正在使用 jQuery,并且我有一个 aAax 请求,如下所示; $.ajax({ type: 'POST', url: 'test.php',
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求提供代码的问题必须表现出对所解决问题的最低限度的了解。包括尝试的解决方案、为什么它们不起作用以及预期结果
我想为系统的每笔交易制定一个程序任务,以预留15分钟的等待时间。如果超过15分钟,程序将改变状态/状态。如果状态在 15 分钟内发生变化,则结束任务。我可以应用更多更好的代码吗?比如Wait/Slee
我正在制作一个打字速度测试程序,它有一个循环需要运行 60 秒然后退出并显示结果。我读过其他关于为 C++ 程序计时的地方,但我的研究没有定论。该程序正在运行 (llbd),我希望有人有解决方案/更好
我试图在一个简单的游戏中每 0.5 - 2 秒随机创建一个障碍。我已经有了创建障碍的功能,但我无法为实例化计时。我试过研究这个,但我还没有想出任何相关的东西。你们能帮帮我吗? 最佳答案 您可以使用 p
我有以下测试,在运行特别长的 fib 断言时不会失败。 未正确失败的测试 #!/usr/env/bin python2.7 import unittest from fib import fib fr
我想知道这是否可行。有没有一种方法可以使用 PHP 每 24 小时更新一次行的值。为什么?我正在创建一个使用在线货币(称为 Yads)的 child 网站。 Row 的值是用户拥有的 Yad 数量。
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求提供代码的问题必须表现出对所解决问题的最低限度理解。包括尝试过的解决方案、为什么它们不起作用,以及预
有 Cron API 这样的东西吗? 我的意思是,是否有一种编程方式可以在不影响 Cron 的情况下添加/删除 Cron 作业? 最佳答案 UNIX cron 的 API 是文件系统。有一个用于安装/
1、SpringBoot:集成Swagger终极版 学习目标: 了解Swagger的概念及作用 掌握在项目中集成Swagger自动生成API文档 1.1、Sw
我是一名优秀的程序员,十分优秀!