spring他本身自带了定时任务的管理功能,就是spring-task
spring-task本身是轻量级的,实现的功能也简单一点没有spring-quartz强大,但是简单的定时任务的需求都是可以满足的。
实现,
首先需要配置需要的标签库:
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd" xmlns:task="http://www.springframework.org/schema/task" xmlns:context="http://www.springframework.org/schema/context"
<bean name="gjyrkJob" class="com.lzdf.spw.sp.task.GjyrkJob" /> <task:scheduled-tasks> <task:scheduled ref="gjcrkJob" method="initGjc" cron="0 30 1 * * ?"/> <task:scheduled ref="gjyrkJob" method="initGjy" cron="0 1 1 * * ?"/> </task:scheduled-tasks> <task:annotation-driven/> <context:component-scan base-package=" com.lzdf.spw.sp.task " />注入具体执行任务就可以了,其中<task: scheduled ref="执行任务类" method="具体的方法" cron="开始执行时间"/>
public class GjyrkJob { public void initGjy() { try { System.out.println("任务开始>........"+ new Date()); // 业务逻辑代码调用 List<Gjycxmx> jjrks = gjybhlyService.getJjrksj(); int size = jjrks.size(); while(size !=0){ gjybhlyService.bhrk(jjrks); jjrks = null; jjrks = gjybhlyService.getJjrksj(); size = jjrks.size(); } /*if(jjrks.size()<5000){ gjcbhlyService.bhrk(jjrks); }else{ //拆分数据五千条为一个list List<List<Gjccxmx>> cfjgs = GjcrkJob.createList(jjrks, 2000); for(int i=0;i<cfjgs.size();i++){ List<Gjccxmx> temp = cfjgs.get(i); gjcbhlyService.bhrk(temp); } }*/ System.out.println("任务结束!"+ new Date()); } catch (Exception e) { System.out.println("任务出现异常"); } } }
在简单介绍一下spring-quartz,首先quartz需要几个包spring-context-support、quartz。用maven
的话配置为
<groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>3.2.13.RELEASE</version> </dependency> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>1.7.3</version> </dependency> <dependency>
spring的配置
<bean id="methodInvokingJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject"> <ref bean="gjcrkJob" /> <!-- 具体的类 --> </property> <property name="targetMethod"> <value>initGjc</value> <!--具体的方法--> </property> </bean> <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> 这里不可以直接在属性jobDetail中引用taskJob,因为他要求的是一个jobDetail类型的对象,所以我们得通过MethodInvokingJobDetailFactoryBean来转一下 <property name="jobDetail"> <ref bean="methodInvokingJobDetail" /> </property> 每天的8点到21点每隔1分钟触发,具体说明见附录 <property name="cronExpression"> <value>0 * 08-21 * * ?</value> </property> </bean> <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> 添加触发器 <property name="triggers"> <list> <ref local="cronTrigger" /> </list> </property> </bean> <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="cronTrigger"/> </list> </property> </bean>
cronExpression的配置说明,具体使用以及参数请百度google 字段 允许值 允许的特殊字符 秒 0-59 , - * / 分 0-59 , - * / 小时 0-23 , - * / 日期 1-31 , - * ? / L W C 月份 1-12 或者 JAN-DEC , - * / 星期 1-7 或者 SUN-SAT , - * ? / L C # 年(可选) 留空, 1970-2099 , - * / - 区间 * 通配符 ? 你不想设置那个字段 下面只例出几个式子 CRON表达式 含义 "0 0 12 * * ?" 每天中午十二点触发 "0 15 10 ? * *" 每天早上10:15触发 "0 15 10 * * ?" 每天早上10:15触发 "0 15 10 * * ? *" 每天早上10:15触发 "0 15 10 * * ? 2005" 2005年的每天早上10:15触发 "0 * 14 * * ?" 每天从下午2点开始到2点59分每分钟一次触发 "0 0/5 14 * * ?" 每天从下午2点开始到2:55分结束每5分钟一次触发 "0 0/5 14,18 * * ?" 每天的下午2点至2:55和6点至6点55分两个时间段内每5分钟一次触发 "0 0-5 14 * * ?" 每天14:00至14:05每分钟一次触发 "0 10,44 14 ? 3 WED" 三月的每周三的14:10和14:44触发 "0 15 10 ? * MON-FRI" 每个周一、周二、周三、周四、周五的10:15触发