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分触发(光棍节)
每天下午的 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
- Spring计划任务(定时任务)
- Spring 定时任务功能
- Spring 定时任务实现
- spring执行定时任务
- spring执行定时任务
- spring中的定时任务
- spring多定时任务
- Spring+Quartz定时任务
- spring的定时任务
- spring 定时任务
- Spring 定时任务功能
- spring多任务定时
- spring quartz 定时任务
- Spring-quartz定时任务
- spring中的定时任务
- Spring 定时任务
- spring 定时任务 quartz
- spring定时任务
- 微信高仿
- React-Native Android 学习笔记——2,自定义 logger
- SharePoint2013 IT Professional - Permission Level
- dos 命令大全
- Android5.0+(Percent 百分比布局)
- Spring定时任务
- sessionFactory &session&transaction interface
- NGUI之UILabel
- Java字符串:StringBuffer使用详解及源码分析
- ThreadLocal
- 对于画图板项目的相关总结和思考
- swift TabBarController UINavigationController 组合使用 带有ScrollView和菜单内容以及tableView
- 【bzoj4443】[Scoi2015]小凸玩矩阵 二分+二分图匹配
- switch