1.spring 的定时任务写法有两种:一种是继承工作类,一种是普通的Bean,定时写法有两种写法:一种是以时间间隔启动任务SimpleTriggerBean,一种是以时刻启动任务CronTriggerBean

2.这里介绍第二种写法

  • 先创建一个普通的作业类,就是要执行自己业务的类
  • 配置spring 的配置文件

普通作业类

  

package com.sgfm.datacenter.action.quartz;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.HashMap; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.poi.util.SystemOutLogger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller; import com.sgfm.base.action.BaseAction;
import com.sgfm.base.util.AESUtil;
import com.sgfm.datacenter.SysConstant;
import com.sgfm.datacenter.entity.TMember;
import com.sgfm.datacenter.exception.AppException;
import com.sgfm.datacenter.service.health.RecordExplainService;
import com.sgfm.datacenter.util.JsonResponseResult;
import com.sgfm.datacenter.util.SysUtils; import net.sf.json.JSONObject; /*
* 定时更新体检订单表的状态,在spring 配置文件托管bean
*/
public class UpdOrderEndTimeAction extends BaseAction{
private static final long serialVersionUID = 1L;
private Log logger = LogFactory.getLog(this.getClass()); @Autowired
private RecordExplainService recordExplainService ; //更新方法
public String updateOrderInfo(){
try{
logger.info("开始执行定时任务");
recordExplainService.updOrderState();
}catch(AppException app){
app.printStackTrace();
logger.info("定时任务执行异常======UpdOrderEndTimeAction---->updateOrderInfo");
}catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
logger.info("时任务执行异常=======UpdOrderEndTimeAction---->updateOrderInfo");
logger.info("");
}
return null;
}
    //更新第二个表
public void updateTjAndGjOrder(){
try{
logger.info("开始执行定时任务2");
}catch(AppException app){
app.printStackTrace();
logger.info("定时任务执行异常======UpdOrderEndTimeAction---->updateOrderInfo");
}catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
logger.info("定时任务执行异常=======UpdOrderEndTimeAction---->updateOrderInfo");
logger.info("");
}
}

}

spring 任务配置,要记得将quartz的相关jar包导入

<?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:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"
default-lazy-init="false">

<!--=========================================================写法1========================================================================-->
<!-- task -->
<!-- 定义了一个任务 -->
<bean id="quartzClock" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass">
<value>com.sgfm.datacenter.quartz.DimingUpdateAllCache</value>
</property>
</bean> <bean id="quartzClock2" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass">
<value>com.sgfm.datacenter.quartz.DimingUpdateSectionCache</value>
</property>
</bean> <!-- 这种配置可以精确几点执行定时任务 -->
<!-- 定义了任务的执行方式 -->
<bean id="cronQuartzClock" class="org.springframework.scheduling.quartz.CronTriggerBean" >
<property name="jobDetail">
<ref bean="quartzClock"></ref>
</property> <property name="cronExpression">
<value>0 0 3 4/4 * ? </value> <!-- 服务启动之后,从第四天开始执行任务,之后每四天执行一次-->
</property>
</bean> <!-- 服务启动半小时秒之后运行 然后每一个小时执行一次任务 -->
<bean id="quartzClockTask" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<property name="jobDetail">
<ref bean="quartzClock2"/>
</property> <property name="startDelay"><!--这里是服务启动后延时多少时间,开始计时任务,单位ms-->
<value>3600000</value>
</property> <property name="repeatInterval"><!--这里是每隔多长时间就进行一次计时任务,单位ms-->
<value>3600000</value>
</property>
</bean> <!--第三步 启动定时任务,注意这里的ref bean -->
<bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="cronQuartzClock"></ref>
<ref bean="quartzClockTask"></ref>
</list>
</property>
</bean> <!-- ============================================================写法二 ============================================================-->
<!-- 托管bean 默认单例模式 -->
<bean id="UpOrderBean" class="com.sgfm.datacenter.action.quartz.UpdOrderEndTimeAction"/>
<!-- 定义任务的执行方法 -->
<bean id="upOrderTask" class= "org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ><ref bean="UpOrderBean"/></property>
<property name="targetMethod" ><value>updateOrderInfo</value></property>
<!-- false 表示非并发执行 -->
<property name="concurrent" value =" false " />
</bean>
<!-- 配置触发器,自定义触发时机 ,SimpleTriggerBean 每隔一段时间执行-->
<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<property name="jobDetail" ref="upOrderTask" />
<property name="startDelay" value="0" /><!-- 调度工厂实例化后,经过0秒开始执行调度 -->
<property name="repeatInterval" value="300000" /><!-- 每5分钟调度一次 -->
</bean>
     <!-- 任务描述2 -->
<bean id="upOrderTask2" class= "org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ><ref bean="UpOrderBean"/></property>
<property name="targetMethod" ><value>updateTjAndGjOrder</value></property>
<!-- false 表示串行执行 -->
<property name="concurrent" value =" false " />
</bean>
<bean id="simpleTrigger2" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<property name="jobDetail" ref="upOrderTask2" />
<property name="startDelay" value="0" /><!-- 调度工厂实例化后,经过0秒开始执行调度 -->
<property name="repeatInterval" value="300000" /><!-- 每5分钟调度一次 -->
</bean>
      <!-- 调度工厂 -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="simpleTrigger" />
            <ref bean="simpleTrigger2" />  
        </list>
</property>
</bean> </beans>

方法2:定义了两个触发器,执行不同的方法。

这里说一下concurrent 这个属性:

  1.场景:作业类A ,作业方法methodA(), 当作业A的bean 是一个无状态的bean 的时候,上一次执行A 的方法methodA的时间超过执行间隔时,下一次执行A的方法methodA又开始执行,这时候就会发生同一个作业的类的同一个方法并行执行。可能造成的后果是重复入库,数据库数据混乱。

  解决方式是:将concurrent=“false”  false 表示不允许并行执行,当上一次的任务执行完毕之后再执行下一次的任务

												

轻松搞定Spring+quartz的定时任务的更多相关文章

  1. 3步轻松搞定Spring Boot缓存

    作者:谭朝红 前言 本次内容主要介绍基于Ehcache 3.0来快速实现Spring Boot应用程序的数据缓存功能.在Spring Boot应用程序中,我们可以通过Spring Caching来快速 ...

  2. 【微服务】之二:从零开始,轻松搞定SpringCloud微服务系列--注册中心(一)

    微服务体系,有效解决项目庞大.互相依赖的问题.目前SpringCloud体系有强大的一整套针对微服务的解决方案.本文中,重点对微服务体系中的服务发现注册中心进行详细说明.本篇中的注册中心,采用Netf ...

  3. 【微服务】之三:从零开始,轻松搞定SpringCloud微服务-配置中心

    在整个微服务体系中,除了注册中心具有非常重要的意义之外,还有一个注册中心.注册中心作为管理在整个项目群的配置文件及动态参数的重要载体服务.Spring Cloud体系的子项目中,Spring Clou ...

  4. 从零开始,轻松搞定SpringCloud微服务系列

    本系列博文目录 [微服务]之一:从零开始,轻松搞定SpringCloud微服务系列–开山篇(spring boot 小demo) [微服务]之二:从零开始,轻松搞定SpringCloud微服务系列–注 ...

  5. 【微服务】之四:轻松搞定SpringCloud微服务-负载均衡Ribbon

    对于任何一个高可用高负载的系统来说,负载均衡是一个必不可少的名称.在大型分布式计算体系中,某个服务在单例的情况下,很难应对各种突发情况.因此,负载均衡是为了让系统在性能出现瓶颈或者其中一些出现状态下可 ...

  6. 【微服务】之五:轻松搞定SpringCloud微服务-调用远程组件Feign

    上一篇文章讲到了负载均衡在Spring Cloud体系中的体现,其实Spring Cloud是提供了多种客户端调用的组件,各个微服务都是以HTTP接口的形式暴露自身服务的,因此在调用远程服务时就必须使 ...

  7. 【微服务】之六:轻松搞定SpringCloud微服务-API网关zuul

    通过前面几篇文章的介绍,我们可以轻松搭建起来微服务体系中比较重要的几个基础构建服务.那么,在本篇博文中,我们重点讲解一下,如何将所有微服务的API同意对外暴露,这个就设计API网关的概念. 本系列教程 ...

  8. 【微服务】之七:轻松搞定SpringCloud微服务-API权限控制

    权限控制,是一个系统当中必须的重要功能.张三只能访问输入张三的特定功能,李四不能访问属于赵六的特定菜单.这就要求对整个体系做一个完善的权限控制体系.该体系应该具备针区分用户.权限.角色等各种必须的功能 ...

  9. 【转】轻松搞定FTP之FlashFxp全攻略

    转载网址:http://www.newhua.com/2008/0603/39163.shtml 轻松搞定FTP之FlashFxp全攻略 导读: FlashFXP是一款功能强大的FXP/FTP软件,融 ...

随机推荐

  1. Spring嵌套事务控制

    A类   callBack_test() B类   testadd() C类   select(),得查询到B类testadd方法中新增的数据.以及初始化一些属性 场景:A类 嵌套 B类  B类嵌套C ...

  2. 2016/2/25 html+css学习资源

    html+css学习资源 1.Position is Everything,一个描述和展示在各种浏览器中发现的bug,并提供css解决方法的网站,顶! 2.一个国外的网页设计论坛 3.http://c ...

  3. Poisson distribution 泊松分布 指数分布

    Poisson distribution - Wikipedia https://en.wikipedia.org/wiki/Poisson_distribution Jupyter Notebook ...

  4. Ant 打包 问题

    Ant 打包问题及解决归纳总结: 1.build.xml注意设置basedir: <project name="s2si"  default="dist" ...

  5. jquery中的工具函数 Utilities

    noConflict(deep) 释放$和Jquery的控制权 isFunction(obj) isArray(obj) isWindow(obj) isNumeric(obj) type(obj) ...

  6. RabbitMQ简述

    官网教程 RabbitMQ是流行的开源消息队列系统,用erlang语言开发.RabbitMQ是AMQP(高级消息队列协议)的标准实现.支持多种客户端,如:Python.Ruby..NET.Java.J ...

  7. fcitx-configtool

    配置输入法

  8. silverlight漂亮的文件上传进度显示原理及示例

    silverlight漂亮的文件上传进度显示原理及示例 作者:chenxumi 出处:博客园  2009/11/27 13:37:11 阅读 1219  次 概述:在网站根目录web.config里配 ...

  9. I.MX6 wpa_applicant 开启 debug 输出

    /*********************************************************************** * I.MX6 wpa_applicant 开启 de ...

  10. 动态点分治入门 ZJOI2007 捉迷藏

    传送门 这道题好神奇啊……如果要是不带修改的话那就是普通的点分治了,每次维护子树中距离次大值和最大值去更新. 不过这题要修改,而且还改500000次,总不能每改一次都点分治一次吧. 所以我们来认识一个 ...