Spring定时任务

来源:互联网 发布:nginx 下载 编辑:程序博客网 时间:2024/06/14 00:03

<span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.2px; background-color: rgb(255, 255, 255);">Spring的定时调度任务包括Quartz和spring task两种,其中</span><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.2px; background-color: rgb(255, 255, 255);">spring task是轻量级的(<span style="line-height: 25.2px;">Spring3.0以后)</span></span>

一、Quartz

比较实用的是MethodInvokingJobDetailFactoryBean类,使用该类的好处是,我们的任务类不再需要继承自任何类,而是普通的pojo

第一步:编写任务类

public class UpdateOrderStatusJobImpl implements UpdateOrderStatusJob{private static Logger logger =  Logger.getLogger(UpdateOrderStatusJobImpl.class);@Resource(name="updateOrderStatusJobService")private UpdateOrderStatusJobService updateOrderStatusJobService;@Overridepublic void UpdateOrderStatusWork() {// TODO Auto-generated method stub//允许执行主机if(!StringUtil.converStr2List(GlobalService.getParamValue(Constant.JOB_SALARYCAL_ALLOW_IP).trim(),",").contains(GlobalService.getLocalHostIp()))return;//应急开关if(!GlobalService.getParamBooleanValue(Constant.JOB_SALARYCAL_ALLOW_SWITCH))return;try {UpdateOrderStatuJobQuery query =new UpdateOrderStatuJobQuery();logger.info("************查询需要更新的订单ID-begin************");query.setScheduleStatus(1);//已发布排班query.setScheduleDate(new Date());query.setStatus(OrderStatus.ACCEPTANCE.getType());List<UpdateOrderStatuJob> uosjList=updateOrderStatusJobService.queryTargetID(query);Integer[] orderIds =new Integer[uosjList.size()];for(int i=0;i<uosjList.size();i++){orderIds[i]=uosjList.get(i).getId().intValue();}logger.info("************查询需要更新的订单ID-end************");logger.info("************更新订单状态-begin************");query.setOrderIds(orderIds);query.setStatus(OrderStatus.SERVICE.getType());int Line=updateOrderStatusJobService.updateReturnLine(query);logger.info("更新"+Line+"条数据");logger.info("************更新订单状态-end************");} catch (BusinessException e) {// TODO Auto-generated catch blocklogger.error("**************UpdateOrderStatusWork,失败原因:----->"+e.getMessage());e.printStackTrace();}}}

第二步:配置MethodInvokingJobDetailFactoryBean

<span style="white-space:pre"></span><bean id="UpdateOrderStatusJob" class=" com.tj.tjk.service.systemmanagement.job.impl.UpdateOrderStatusJobImpl"></bean> 
<span style="white-space:pre"></span><bean id="UpdateOrderStatusJobTask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">        <!-- 调用的类 -->         <property name="targetObject">                 <ref bean="UpdateOrderStatusJob"/>             </property>             <!-- 调用类中的方法 -->             <property name="targetMethod">                 <value>UpdateOrderStatusWork</value>             </property>         </bean>
声明一个MethodInvokingJobDetailFactoryBean,有两个关键属性:
targetObject指定任务类,
targetMethod指定运行的方法。

第三步:配置作业调度的触发方式(触发器)

 <span style="white-space:pre"></span><bean id="UpdateOrderStatus" class="org.springframework.scheduling.quartz.CronTriggerBean">  <span style="white-space:pre"></span>    <property name="jobDetail">                 <ref bean="UpdateOrderStatusJobTask"/>             </property>             <!-- cron表达式  每1小时执行-->             <property name="cronExpression">                 <value>0 0 0/1 * * ?</value>            </property>         </bean>

第四步:配置调度工厂

<span style="white-space:pre"></span><bean id="startQuertz"  autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">             <property name="triggers">                 <list>                     <ref bean="UpdateOrderStatus"/>                </list>             </property>         </bean> 

二、Spring-Task

第一种:配置文件方式

第一步:编写普通的pojo

import org.springframework.stereotype.Service;@Servicepublic class TaskJob {        public void job1() {        System.out.println(“任务进行中。。。”);    }}

 第二步:在spring配置文件头中添加命名空间及描述

<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配置文件中设置具体的任务

 <task:scheduled-tasks>         <task:scheduled ref="taskJob" method="job1" cron="0 * * * * ?"/> </task:scheduled-tasks><context:component-scan base-package=" com.gy.mytask " />


第二种:使用注解形式

源文件中该注解@Scheduled的定义:

@Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.ANNOTATION_TYPE})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @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

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相关的配置:

<?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.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsdhttp://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 />这句配置就可以了,这些参数都不是必须的。


三、spring quartz 时间格式

*  *  *  *  *  **
秒  分  时  日    月     周          年


详细例子
0 0 12 * * ?每天12点触发0 15 10 ? * *每天10点15分触发0 15 10 * * ?每天10点15分触发0 15 10 * * ? *每天10点15分触发0 15 10 * * ? 20052005年每天10点15分触发0 * 14 * * ?每天下午的 2点到2点59分每分触发0 0/5 14 * * ?每天下午的 2点到2点59分(整点开始,每隔5分触发)0 0/5 14,18 * * ?每天下午的 2点到2点59分(整点开始,每隔5分触发)
每天下午的 18点到18点59分(整点开始,每隔5分触发)0 0-5 14 * * ?每天下午的 2点到2点05分每分触发0 10,44 14 ? 3 WED3月分每周三下午的 2点10分和2点44分触发0 15 10 ? * MON-FRI从周一到周五每天上午的10点15分触发0 15 10 15 * ?每月15号上午10点15分触发0 15 10 L * ?每月最后一天的10点15分触发0 15 10 ? * 6L每月最后一周的星期五的10点15分触发0 15 10 ? * 6L 2002-2005从2002年到2005年每月最后一周的星期五的10点15分触发0 15 10 ? * 6#3每月的第三周的星期五开始触发0 0 12 1/5 * ?每月的第一个中午开始每隔5天触发一次0 11 11 11 11 ?每年的11月11号 11点11分触发(光棍节)

开发过程中用到了Quartz,特此学习、总结

参考资料

1、http://gong1208.iteye.com/blog/1773177

2、http://blog.csdn.net/han_dongwei/article/details/22292145


0 0
原创粉丝点击