Java定时器和Quartz使用
一、Java普通自定义定时器
/**
* 自定义一个定时器
* @author lw
*/
public class MyTimer extends Thread{ private Long time ; public MyTimer(Long time) {
this.time = time;
} @Override
public void run() {
while(true){
try {
Thread.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
send();
}
}
/**
* 开始执行任务
*/
public void execute(){
this.start();
} /**
* 定时任务
*/
private void send() {
System.out.println("任务执行了:" + new Date());
} public static void main(String[] args) {
MyTimer myTimer = new MyTimer(2000L) ;
myTimer.execute();
} }
输出内容:
任务执行了:Tue Nov 13 10:10:02 CST 2018
任务执行了:Tue Nov 13 10:10:04 CST 2018
任务执行了:Tue Nov 13 10:10:06 CST 2018
任务执行了:Tue Nov 13 10:10:08 CST 2018
任务执行了:Tue Nov 13 10:10:10 CST 2018
任务执行了:Tue Nov 13 10:10:12 CST 2018
任务执行了:Tue Nov 13 10:10:14 CST 2018
任务执行了:Tue Nov 13 10:10:16 CST 2018
任务执行了:Tue Nov 13 10:10:18 CST 2018
任务执行了:Tue Nov 13 10:10:20 CST 2018
二、使用Java Timer类
public class TimerTest {
public static void main(String[] args) {
Timer timer = new Timer();
// 5s后执行
// timer.schedule(new MyTask(), 5000);
// 马上执行任务,每隔1000执行一次
timer.scheduleAtFixedRate(new MyTask(), new Date(), 1000);
}
}
// 定时任务,这是一个线程
class MyTask extends TimerTask {
@Override
public void run() {
System.out.println("task execute ");
}
}
Timer也是基于线程来实现的。
三、Quartz框架
Quartz是一个完全由Java编写的开源作业调度框架,为在Java应用程序中进行作业调度提供了简单却强大的机制。Quartz允许开发人员根据时间间隔来调度作业。它实现了作业和触发器的多对多的关系,还能把多个作业与不同的触发器关联。
使用如下:
创建job
public class HelloJob implements Job{
public void execute(JobExecutionContext context) throws JobExecutionException {
JobDetail detail = context.getJobDetail();
String name = detail.getJobDataMap().getString("name");
System.out.println("say hello " + name );
}
}
测试
public class QuartzTest {
public static void main(String[] args) throws InterruptedException {
// 创建工厂
SchedulerFactory schedulerfactory = new StdSchedulerFactory();
Scheduler scheduler = null;
try {
// 通过schedulerFactory获取一个调度器
scheduler = schedulerfactory.getScheduler();
// 指明job的名称,所在组的名称,以及绑定job类
JobDetail job = JobBuilder.newJob(HelloJob.class).withIdentity("JobName", "JobGroupName")
.usingJobData("name", "quartz").build();
// 定义触发的条件
Trigger trigger = TriggerBuilder.newTrigger().withIdentity("CronTrigger1", "CronTriggerGroup")
.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(3).repeatForever())
.startNow().build();
// 把作业和触发器注册到任务调度中
scheduler.scheduleJob(job, trigger);
// 启动调度
scheduler.start();
Thread.sleep(10000);
// 停止调度
scheduler.shutdown();
} catch (SchedulerException e) {
e.printStackTrace();
}
}
}
步骤:
- 创建job
- 创建工厂,获取调度器
- 使用JobBuilder通过job生成jobDetail,可以传递数据
- 通过TriggerBuilder创建Trigger,可以设置时间
- 通过调度器注册ob和trigger
- 启动调度
四、Quarts 和 Spring整合
创建job
public class MailJob {
private void send() {
System.out.println("发送邮件了:" + new Date());
}
}
配置
<description>Quartz配置文件</description>
<!-- 定义一个job -->
<bean id="mailJob" class="com.lw.jk.job.MailJob"></bean>
<!-- 定义一个 MethodInvokingJobDetailFactoryBean-->
<bean id="methodInvokingJobDetailFactoryBean" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="mailJob"></property>
<property name="targetMethod" value="send"></property>
</bean>
<!-- 指定时间 -->
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="methodInvokingJobDetailFactoryBean"></property>
<property name="cronExpression" value="0/10 * * * * ? *"></property>
</bean> <!-- 指定调度器 -->
<bean id="schedule" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="cronTrigger"/>
</list>
</property>
</bean>
输出结果:
发送邮件了:Sat Apr 15 16:12:00 CST 2017
发送邮件了:Sat Apr 15 16:12:10 CST 2017
四、spring 自带的定时任务:spring-task
spring 自身的spring-task 不依赖任何的第三方框架,实现方式也很简单:
这里需要做的就是在xml文件中的引入task命名空间,以便后续标签中的使用:
xmlns:task="http://www.springframework.org/schema/task"
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-3.2.xsd
1:定义任务类:
public class TaskJob {
public void springJob(){
System.out.println("spring 自身的定时任务");
}
}
2:在xml配置文件中配置定时job:
1 <!--配置任务类-->
<bean id="beanA" class="bz.beppe.javase.TaskJob"></bean>
<!--定义触发类和触发方式-->
<task:scheduled-tasks scheduler="myScheduler">
<task:scheduled ref="beanA" method="springJob" fixed-rate="5000"/>
</task:scheduled-tasks> <task:scheduler id="myScheduler" pool-size="10"/>
经过这样的配置后在在开启这个定时任务的spring容器后就会开始相应的定时job。
Java定时器和Quartz使用的更多相关文章
- java定时器,Spring定时器和Quartz定时器
一.java定时器的应用 其实java很早就有解决定时器任务的方法了,java提供了了类java.util.TimerTask类基于线程的方式来实现定时任务的操作,然后再提供java.util.Tim ...
- Java生鲜电商平台-定时器,定时任务quartz的设计与架构
Java生鲜电商平台-定时器,定时任务quartz的设计与架构 说明:任何业务有时候需要系统在某个定点的时刻执行某些任务,比如:凌晨2点统计昨天的报表,早上6点抽取用户下单的佣金. 对于Java开源生 ...
- 实现quartz定时器及quartz定时器原理介绍(转)
一.核心概念 Quartz的原理不是很复杂,只要搞明白几个概念,然后知道如何去启动和关闭一个调度程序即可.1.Job表示一个工作,要执行的具体内容.此接口中只有一个方法void execute(Job ...
- java定时器实现总结
前言:Java定时器目前主要有3种实现方式:JDK组件,Spring Task,Quartz框架. 1. JDK组件(1) java.util.TimerTask MyTimerTask.java: ...
- 33、生鲜电商平台-定时器,定时任务quartz的设计与架构
说明:任何业务有时候需要系统在某个定点的时刻执行某些任务,比如:凌晨2点统计昨天的报表,早上6点抽取用户下单的佣金. 对于Java开源生鲜电商平台而言,有定时推送客户备货,定时计算卖家今日的收益,定时 ...
- Java EE学习——Quartz的Cron表达式
经历过低谷后,还是要好好学习,越失落会越来越落后. 今天写一下Cron表达式的用法,虽然是之前自己写的,也过了挺长一段时间,这次就拿出来作为回顾吧. Cron表达式是Quartz的精髓(个人觉得),比 ...
- java定时器和多线程实践记录
这几天因为需要测试mongodb读写分离的问题,因此写了个定时查询程序,并且用到了多线程,以达到定时启动多个线程查询数据库的效果,下边代码记录备忘: package timmer; import ja ...
- [转][JAVA]定时任务之-Quartz使用篇
[BAT][JAVA]定时任务之-Quartz使用篇 定时任务之-Quartz使用篇 Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与 ...
- Java定时器:Timer
项目中往往会遇到需要定时的任务,例如订单,当用户在某个规定时间内没有操作订单时,订单状态将会发生改变. 那么在这种情况下,我们会用到定时器. 举例: import java.util.Timer; / ...
随机推荐
- 关于Cocos2d-x中节点的获取
方法一: 1.在.h文件的属性里面先声明要使用的节点或者变量. private: Label *scorelabel; 2.在.cpp文件中创建并使用这个节点或者变量. scorelabel = La ...
- python + opencv: kalman 跟踪
之前博文中讲解过kalman滤波的原理和应用,这里用一个跟踪鼠标的例程来演示怎么在opencv里用自带的kalman函数进行目标跟踪,文章的内容对做图像跟踪有借鉴意义.文章主要是网络资源进行整理和简单 ...
- appium的inspectot使用
前提已安装好appium环境 1. 打开appium-doctor 2. 启动appium-service,点击 inspector 3. 配置手机参数,参数获取参考上篇博客 4. 点击start ...
- SSL双向认证Java实现 Tomcat篇
双向验证,在客户机连接服务器时,客户机验证服务器的证书,服务器验证客户机的证书,链接双方都要对彼此的数字证书进行验证,保证这是经过授权的才能够连接. 1. 生成服务器端的keystore和trusts ...
- 【Java面试题】47 heap和stack有什么区别
java的内存分为两类,一类是栈内存,一类是堆内存.栈内存是指程序进入一个方法时,会为这个方法单独分配一块私属存储空间,用于存储这个方法内部的局部变量,当这个方法结束时,分配给这个方法的栈会释放,这个 ...
- Apache 运行PHP原理
php,apache和mysql组合的工作过程: PHP的所有应用程序都是通过WEB服务器(如IIS或Apache)和PHP引擎程序解释执行完成的,工作过程: (1)当用户在浏览器地址中输入要访问的P ...
- PHP生成UTF-8编码的CSV文件用Excel打开乱码的解决办法
什么是BOM? 在UCS 编码中有一个叫做”ZERO WIDTH NO-BREAK SPACE”的字符,它的编码是FEFF.而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中.UCS规范建 ...
- optimization blocks (csapp chapter 5.1)
p_511 编译器在没有指示下,会做‘ safe optimization',因此有些优化在没有参数的指示下是不会对代码做优化的,故在程序中应该避免某一类代码,因为它们妨碍了编译器做优化. optim ...
- Linux的缓存内存 Cache Memory详解
http://www.ha97.com/4337.html PS:前天有童鞋问我,为啥我的Linux系统没运行多少程序,显示的可用内存这么少?其实Linux与Win的内存管理不同,会尽量缓存内存以提高 ...
- 在express项目中使用formidable & multiparty实现文件上传
安装 formidable,multiparty 模块 npm install formidable,multiparty –save -d 表单上传 <form id="addFor ...