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. 菜鸟Sublime日记

            一.进行系统安装:www.sublimetext.com/3   选择相应的操作系统,你会发现安装速度惊人的快. 二.安装完成以后,先安装两个基本的插件package control ...

  2. 嵌入式开发之davinci--- 8148/8168/8127 中的添加算饭scd 场景检测 文档简介

    Osd Scd (1)     Introduction over view a)         scene change detection block diagram a)         gr ...

  3. &lt;转&gt;bash: qmake: command not found...

    昨天发现qmake这个命令不能使用,查了一些资料,大部分都说是环境变量没有设置好: Qt默认安装是在 /opt/qt-xxxx/qt/bin 或者 /opt/qt-xxx/bin 下.实在不行就查找 ...

  4. HOSVD高阶奇异值分解

    高阶奇异值分解(High Order Singular Value  Decomposition,   HOSVD) 奇异值分解SVD(Singular Value Decomposition)是线性 ...

  5. lsblk df

    df(1) - Linux manual page http://man7.org/linux/man-pages/man1/df.1.html report file system disk spa ...

  6. 【java报错】CacheLoader returned null for key class

    CacheLoader returned null for key class cmd     mvn eclipse:clean eclipse:eclipse mvn install -Dmave ...

  7. Lightoj 1020 - A Childhood Game

    Allice先拿,最后拿球的输. Bob先拿,最后拿球的赢. 考虑Alice先拿球,当n=1时 Alice输  记dp[1]=0; n=2,  dp[2]=1 n=3,  dp[3]=1 因为n=1, ...

  8. Serializable and XmlEnum

    The easiest way is to use [XmlEnum] attribute like so: [Serializable] public enum EnumToSerialize { ...

  9. 提高你的Python: 解释‘yield’和‘Generators(生成器)’

    在开始课程之前,我要求学生们填写一份调查表,这个调查表反映了它们对Python中一些概念的理解情况.一些话题("if/else控制流" 或者 "定义和使用函数" ...

  10. [Django基础] django解决静态文件依赖问题以及前端引入方式

    一.静态文件依赖 学习django的时候发现静态文件(css,js等)不能只在html中引入,还要在项目的settings中设置,否则会报以下错误 [11/Sep/2018 03:18:15] &qu ...