轻松搞定Spring+quartz的定时任务
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的定时任务的更多相关文章
- 3步轻松搞定Spring Boot缓存
作者:谭朝红 前言 本次内容主要介绍基于Ehcache 3.0来快速实现Spring Boot应用程序的数据缓存功能.在Spring Boot应用程序中,我们可以通过Spring Caching来快速 ...
- 【微服务】之二:从零开始,轻松搞定SpringCloud微服务系列--注册中心(一)
微服务体系,有效解决项目庞大.互相依赖的问题.目前SpringCloud体系有强大的一整套针对微服务的解决方案.本文中,重点对微服务体系中的服务发现注册中心进行详细说明.本篇中的注册中心,采用Netf ...
- 【微服务】之三:从零开始,轻松搞定SpringCloud微服务-配置中心
在整个微服务体系中,除了注册中心具有非常重要的意义之外,还有一个注册中心.注册中心作为管理在整个项目群的配置文件及动态参数的重要载体服务.Spring Cloud体系的子项目中,Spring Clou ...
- 从零开始,轻松搞定SpringCloud微服务系列
本系列博文目录 [微服务]之一:从零开始,轻松搞定SpringCloud微服务系列–开山篇(spring boot 小demo) [微服务]之二:从零开始,轻松搞定SpringCloud微服务系列–注 ...
- 【微服务】之四:轻松搞定SpringCloud微服务-负载均衡Ribbon
对于任何一个高可用高负载的系统来说,负载均衡是一个必不可少的名称.在大型分布式计算体系中,某个服务在单例的情况下,很难应对各种突发情况.因此,负载均衡是为了让系统在性能出现瓶颈或者其中一些出现状态下可 ...
- 【微服务】之五:轻松搞定SpringCloud微服务-调用远程组件Feign
上一篇文章讲到了负载均衡在Spring Cloud体系中的体现,其实Spring Cloud是提供了多种客户端调用的组件,各个微服务都是以HTTP接口的形式暴露自身服务的,因此在调用远程服务时就必须使 ...
- 【微服务】之六:轻松搞定SpringCloud微服务-API网关zuul
通过前面几篇文章的介绍,我们可以轻松搭建起来微服务体系中比较重要的几个基础构建服务.那么,在本篇博文中,我们重点讲解一下,如何将所有微服务的API同意对外暴露,这个就设计API网关的概念. 本系列教程 ...
- 【微服务】之七:轻松搞定SpringCloud微服务-API权限控制
权限控制,是一个系统当中必须的重要功能.张三只能访问输入张三的特定功能,李四不能访问属于赵六的特定菜单.这就要求对整个体系做一个完善的权限控制体系.该体系应该具备针区分用户.权限.角色等各种必须的功能 ...
- 【转】轻松搞定FTP之FlashFxp全攻略
转载网址:http://www.newhua.com/2008/0603/39163.shtml 轻松搞定FTP之FlashFxp全攻略 导读: FlashFXP是一款功能强大的FXP/FTP软件,融 ...
随机推荐
- 第3周课后实践·程序阅读(4)-利用引用訪问私有数据成员
/* * Copyright (c) 2015, 烟台大学计算机学院 * All rights reserved. * 文件名:test.cpp * 作 者:刘畅 * 完毕日期:2015年 3 月 2 ...
- Android实战简易教程-第四十枪(窃听风云之短信监听)
近期在做监听验证码短信自己主动填入的功能,无意间想到了一个短信监听的办法. 免责声明:短信监听本身是一种违法行为,这里仅仅是技术描写叙述.请大家学习技术就可以.(哈哈) 本实例是基于bmob提供的后台 ...
- cygwin安装sshd服务(win7)Error installing a service: OpenSCManager: Win32 error 5:
Error installing a service: OpenSCManager: Win32 error 5: 出现这个问题的解决办法:win7系统管理员运行Cygwin软件 ...
- Posting array of JSON objects to MVC3 action method via jQuery ajax
Does the model binder not suport arrays of JSON objects? The code below works when sending a single ...
- nextLine() 、nextInt()的跳过问题
nextInt() 将输入的信息的下一个标记扫描为 int. nextLine() 此扫描器执行当前行,并返回跳过的输入信息. nextInt 会读取下面输入的 int类型的信息以回车作为结束,如果 ...
- SoapUI中Code多行显示设置
你们的SoapUI 有设置下面的选项吗? Before adding your project, we recommend that you enable the following ReadyAPI ...
- HDU4738 Caocao's Bridges —— 边双联通分量 + 重边
题目链接:https://vjudge.net/problem/HDU-4738 A network administrator manages a large network. The networ ...
- YTU 1002: Home Work
1002: Home Work 时间限制: 1000 Sec 内存限制: 64 MB 提交: 288 解决: 41 题目描述 临近开学了,大家都忙着收拾行李准备返校,但I_Love_C却不为此担心 ...
- manacher求最长回文子串算法
原文:http://www.felix021.com/blog/read.php?2040 首先用一个非常巧妙的方式,将所有可能的奇数/偶数长度的回文子串都转换成了奇数长度:在每个字符的两边都插入一个 ...
- 【转】Android性能优化之GPU过度绘制与图形渲染优化
标签: android / 优化 / 过度绘制 / 图形渲染优化 Android之GPU过度绘制与图形渲染优化 写在前面的话 本文主要对过度绘制和图形渲染做一个概念性的描述,和简单的优化措施. 如果你 ...