Quartz定时任务的实现及详解

Quartz定时任务的实现及详解


平常工作中经常遇到写定时任务的,这次做一次记录和解析分享给大家,共同学习进步,遇到写的不对的地方也请大家指教

用例:比如每天凌晨我们要让系统定时执行一些耗费服务器的事情,或者其他的一些定时任务

相关的jar包在附件,如有需要自行下载

1、首先怎么启动这个Quartz呢?
在项目启动的时候,让web.xml读取我们的定时器配置文件,如下所示


	<param-name>contextConfigLocation</param-name>
		<param-value>
		/WEB-INF/config/quartz.xml//是我们配置定时任务的文件
                //...等等其他任务
	</param-value>


2、接着再来看一下我们的quartz.xml是怎么写的
,注释有点长,排版不是很清楚,可以直接拷贝在本地的xml查看,如下所示

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

	//<!-- 时间调度属性配置文件 -->
	<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="locations">
			<list>
				<value>WEB-INF/config/quartz.properties</value><!--如果定时任务较多,可以在这里开辟一个配置文件来统一管理时间-->
			</list>
		</property>
	</bean>
	
	//<!--如果targetObject中引用的类在struts.xml或者其他地方没有配置的时候可以在本xml配置,就像这样-->
	<!--<bean id="refreshCacheJob" class="com.xxx.web.job.impl.refreshCacheJob"></bean>-->
	<bean id="mobileSearchJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">   
	       <property name="targetObject" ref="refreshCacheJob"/>
//<!--目标对象(任务要在哪个类中执行,可以直接在ref里面引用配置文件中的别名)-->
	       <property name="targetMethod" value="execute"/>
 //<!--要执行目标对象里的什么方法-->
	       <property name="concurrent" value="false"/>
//<!--concurrent==false 任务不并行(即当第一个任务还没有执行完,此时第二个任务触发要等到第一个执行完毕才会执行第二个)-->
	</bean> 
	<bean id="mobileSearchTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
//<!--有corn与simple触发器两种-->
       <property name="jobDetail" ref="mobileSearchJob"/>
//<!--要触发的任务-->  
       <property name="cronExpression" value="${mobileReset_time}"/>
//<!-- corn表达式(引用型)每隔3分钟触发一次 -->  
	  <!-- <property name="cronExpression" <value>0 0 2 * * ?</value>/>-->//<!--直接corn表达式的值-->
	</bean> 

	//<!-- 控制器类 -->
	<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
		<property name="triggers">
			<list>
				<ref bean="mobileSearchTrigger" />
				//..引用其他的定时任务
			</list>
		</property>
	</bean> 
</beans>


3、最后就是我们具体的实现了,就是一个普通类
package com.xxx.db.quartz;
import com.fuiou.fwp.db.mapper.TUappOrderAcqMapper;

public class refreshCacheJob {
	public void doSearch(){//具体的任务实现的方法
		//
	}
}

本页内容版权归属为原作者,如有侵犯您的权益,请通知我们删除。

JDBC连接数据库的步骤详解 - 2016-09-23 04:09:09

   Java Code  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 8
编译Qconf git clone https://github.com/Qihoo360/QConf.git cd Qconf //注意如果不是root永恒,可能需要使用sudo权限 mkdir build cd build // 默认安装在/usr/local/qconf目录,后面的命令指定安装目录 cmake ..  或者 cmake .. -DCMAKE_INSTALL_PREFIX=/install/prefix make make install //如果出错,也就下面几个错误了 sudo l

Java 使用默认浏览器打开 URL - 2016-09-22 19:09:07

      URI uri = new URI(url);Desktop desktop = Desktop.getDesktop();if (desktop.isSupported(Desktop.Action.BROWSE)) {desktop.browse(uri);}            

Java线程Dump分析工具--jstack - 2016-09-22 18:09:03

Java线程Dump分析工具--jstack jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项"-J-d64",Windows的jstack使用方式只支持以下的这种方式:      jstack [-l][F] pid      如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。另

java spring整合websocket - 2016-09-21 17:09:03

这几天项目中需要整合websocket来支持业务,从网上看了好多资料。但是都很杂乱,我尝试了好多回,走了很多弯路,跳了很多坑~~~~~~。通过两天的调试终于成功!!!现在把调试步骤和容易出现的问题都列出来,让和我这样的新手有点帮助。开始上代码......... 【 备注:spring的版本4.0+ ,tomcat :7.50 + , jdk:1.8 】 java Spring 整合 websocket 有两种方法 : 1:配置方法 [网上有很多] (地址: http://blog.csdn.net/sti

Java命令行classpath的设置 - 2016-09-21 17:09:03

在练习JavaDB Embedded模式的Java编程时候,直接用编辑器开发,所以需要用平时不怎么用的命令行来编译代码,按照普通的方式进行编译之后,开始运行,结果弹出错误提示。 java -classpath derby.jar JavaDBTest 错误: 找不到或无法加载主类 JavaDBTest 想不通是怎么回事。后来发现,需要将当前目录也加入到ClassPath中 java -classpath .;derby.jar JavaDBTest 这样才能成功运行 Load the EmbeddedDri

java 虚拟机-内存管理 - 2016-09-21 14:09:23

      本地方法 非java代码实现的java方法,使用native关键字,除abstract外可与java关键字连用 程序计数器 可以看作是当前线程所执行的字节码的行号指示器。字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支,循环,跳转,异常处理,线程恢复等基础功能。该区域时java虚拟机规范中没有规定outofmeroryError情况的区域 虚拟机栈   1、生命周期同线程一致 2、程序员通常指的栈内存区,更确切的是指虚拟机栈中的局部变量表部分 3、局部变量表存
jAVA基础 提高文件复制性能之多线程复制文件 利用IO流中的随机访问文件 RandomAccessFile 和文件通道 FileChanne 复制文件可大大提高文件的读写效率,在此基础上利用多线程复制文件使其性能更优。因线程的个数可根据文件的大小及需求而定。其大概原理是根据给定的线程个数,将文件分段,每个线程负责的数据大小=文件长度/线程个数,将不能除尽的部分留给最后一段文件所分配的线程处理。以下是实现代码及自己理解的注释,多有偏差请见谅。下面是兄弟连java培训总结的一些代码:供参考。 程序实现类代码
这个是我一个技术相当好的哥们去面试的时候碰到的奇葩问题,那天,这个面试官的答案是不能。后来就带着这个问题去国内外的论坛上搜了一把,也是各说纷纭,实在是没有一个统一的答案,简直有点公说公有理,婆说婆有理的架势。     几个意见大致如下,第一,不能,因为“进程是CPU进行调度的单位,而JVM是一个进程,于是就只能跑在一个CPU上”。第二,“进程是CPU进行调度的单位,这没错,但是OS负责将一个进程在不同的CPU上调度到另外一个CPU上,而这个进程,则是由不同的线程构成的,那么说,线程还是在不同的CPU上运行了
1、一个简单的订单号生成器: 从代码可以看出: long orderNo = (Long.parseLong((date))) * 10000;   orderNo += orderNum + Long.parseLong(RandomStringUtils.randomNumeric(3)); 每毫秒可以保证,10000-999个订单号不重复。     import java.text.SimpleDateFormat;import java.util.Date;import org.apache.co