Quatz是Spring的一个定时任务组件。支持通过数据来进行定时任务调度。

典型使用场景

1、在多台java微服务中,到点让全部节点执行某段逻辑。如果是固定在某台,可以通过在逻辑中判断ip实现。
2、在多台java微服务中,到点让有且一台节点执行某段逻辑。
3、在多台java微服务中,到点让若干台节点执行某段逻辑。

POM依赖

    <dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId></dependency>

Bean创建

1、MethodInvokingJobDetailFactoryBean – targetMethod

    <bean id="execute_xxxTaskJobDetail"class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"><property name="targetObject" ref="xxxTask" /><property name="targetMethod" value="taskRunOnLocalMode" /><property name="concurrent" value="false" /><property name="arguments"><map /></property></bean>

其中的targetObject对应任务类,targetMethod对应执行的方法。

2、LocalTimeCronTriggerFactoryBean – cron表达式

    <bean id="execute_xxxTask"class="LocalTimeCronTriggerFactoryBean"><property name="jobDetail" ref="execute_xxxTaskJobDetail" /><property name="cronExpression" value="${xxx.task.cron}" /></bean>
public class LocalTimeCronTriggerFactoryBean extends CronTriggerFactoryBean {public LocalTimeCronTriggerFactoryBean() {this.setTimeZone(TimeZoneUtil.getSystemTimeZone());}
}

3、SchedulerFactoryBean – dataSource配置

    <bean id="xxxTask_serial_quartz_inclusive" lazy-init="true"class="org.springframework.scheduling.quartz.SchedulerFactoryBean"><property name="quartzProperties"><props><prop key="org.quartz.scheduler.skipUpdateCheck">true</prop></props></property><property name="triggers"><list><ref bean="execute_xxxTask" /></list></property></bean>

如果使用exclusive模式
1、 jobDetail的bean

    <bean id="cleanAppRatingTaskExclusive" class="org.springframework.scheduling.quartz.JobDetailFactoryBean"><property name="durability" value="true" /><property name="requestsRecovery" value="true" /><property name="jobClass" value="quartzJobBean" /><property name="jobDataAsMap"><map><entry key="targetObject" value="xxxTask" /><entry key="targetMethod" value="taskRunOnClusterMode" /><entry key="param"><map /></entry></map></property></bean>

2、scheduler bean

    <bean id="xxxTask_serial_quartz_exclusive" lazy-init="false" autowire="no"class="org.springframework.scheduling.quartz.SchedulerFactoryBean" destroy-method="destroy"><property name="quartzProperties"><props><prop key="org.quartz.scheduler.skipUpdateCheck">true</prop></props></property><property name="applicationContextSchedulerContextKey" value="applicationContext" /><property name="configLocation" value="classpath:quartz-exclusive.properties" /><property name="dataSource" ref="qrtzDataSource" /><property name="overwriteExistingJobs" value="${quartz.overwriteExistingJobs:false}" /><property name="startupDelay" value="30" /><property name="autoStartup" value="true" /><property name="triggers"><list><ref bean="execute_xxxTaskExclusive" /></list></property></bean>
</beans>
#==============================================================
#Configure Main Scheduler Properties
#==============================================================
org.quartz.scheduler.instanceId = AUTO  #==============================================================
#Configure JobStore
#==============================================================
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.tablePrefix = QRTZ_
org.quartz.jobStore.isClustered = true
org.quartz.jobStore.clusterCheckinInterval = 20000
org.quartz.jobStore.maxMisfiresToHandleAtATime = 1
org.quartz.jobStore.misfireThreshold = 120000
org.quartz.jobStore.txIsolationLevelSerializable = true
org.quartz.jobStore.selectWithLockSQL = SELECT * FROM {0}LOCKS WHERE LOCK_NAME = ? FOR UPDATE  #==============================================================
#Configure ThreadPool
#==============================================================
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 10
org.quartz.threadPool.threadPriority = 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true  #============================================================================
# Configure Plugins
#============================================================================
org.quartz.plugin.triggHistory.class = org.quartz.plugins.history.LoggingJobHistoryPlugin
org.quartz.plugin.shutdownhook.class = org.quartz.plugins.management.ShutdownHookPlugin
org.quartz.plugin.shutdownhook.cleanShutdown = true

定时任务注意事项

增加runnable开关,来控制定时任务是否执行。

因为微服务多实例用通一份代码部署,都会启动定时任务。
通过读取本机IP(link)和配置项中的ip做对比,可以指定在某个机器执行。

只是执行一次的定时任务,比如做数据割接的,可以增加具体的执行日期的配置项。
配合cron表达式,可以做到到点执行一次。

循环处理表里面的数据,需要注意异常的处理。
比如在每次循环体中catch,记录异常的数据id到日志。

从数据库中批量查询时,注意控制数量,防止出现oom。
如果是需要做表遍历时,使用聚簇索引作where id > xx条件,提高深分页性能。

使用 Spring Quartz组件实现定时任务相关推荐

  1. 基于spring+quartz的分布式定时任务框架

    http://www.cnblogs.com/aaronfeng/p/5537177.html 问题背景 我公司是一个快速发展的创业公司,目前有200人,主要业务是旅游和酒店相关的,应用迭代更新周期比 ...

  2. Spring 3整合Quartz 2实现定时任务--转

    常规整合 http://www.meiriyouke.net/?p=82 最近工作中需要用到定时任务的功能,虽然Spring3也自带了一个轻量级的定时任务实现,但感觉不够灵活,功能也不够强大.在考虑之 ...

  3. Spring 3整合Quartz 2实现定时任务(转)

    http://www.meiriyouke.net/?p=82 最近工作中需要用到定时任务的功能,虽然Spring3也自带了一个轻量级的定时任务实现,但感觉不够灵活,功能也不够强大.在考虑之后,决定整 ...

  4. 使用Spring Boot + Quartz 实现分布式定时任务平台

    本文将从项目实战出发来介绍分布式定时任务的实现.在某些应用场景下要求任务必须具备高可用性和可扩展性,单台服务器不能满足业务需求,这时就需要使用Quartz实现分布式定时任务. 一.分布式任务应用场景 ...

  5. java 定时任务插件_详解Spring整合Quartz实现动态定时任务

    最近项目中需要用到定时任务的功能,虽然spring 也自带了一个轻量级的定时任务实现,但感觉不够灵活,功能也不够强大.在考虑之后,决定整合更为专业的Quartz来实现定时任务功能. 普通定时任务 首先 ...

  6. 使用Spring整合Quartz轻松完成定时任务

    一.背景 上次我们介绍了如何使用Spring Task进行完成定时任务的编写,这次我们使用Spring整合Quartz的方式来再一次实现定时任务的开发,以下奉上开发步骤及注意事项等. 二.开发环境及必 ...

  7. 使用Spring提供Quartz来实现定时任务

    Spring功能越来越多了,用起来还很舒服方便,Quartz实现的定时任务就是一个. 首先是配置文件: <?xml version="1.0" encoding=" ...

  8. Spring+Quartz实现定时任务

    Spring整合Quartz实现定时任务步骤很简单,大致需要经过如下几步:创建任务(Job).配置JobDetail.配置触发器(Trigger).配置SchedulerFactoryBean 首先使 ...

  9. quarts集群 运维_精讲Elastic-job + Quartz实现企业级定时任务

    掌握分布式集群方式的定时任务框架,可以弥补企业中常用的单点任务的缺点,以更高的性能更好的稳定性处理分布式定时任务服务:本课程带你掌握分布式框架Elastic-Job和Quartz,在以多种方式开发定时 ...

最新文章

  1. python编写自动化脚本 与shell_脚本安装Discuz论坛(shell + Python 实现自动化安装)...
  2. 怎么强制限制div宽度
  3. 手机控制linux电脑,通过Amora用symbian手机控制linux系统的电脑
  4. springmvc简单示例
  5. JAVA校内报纸实验_实验(实训)中心2011—2012学年第二学期工作计划
  6. Centos7设置DNS开机启动
  7. 华为Mate 40工程机曝光:并未采用屏下摄像头
  8. Laravel nginx 伪静态规则
  9. Picasso源码的简单解析(二)
  10. android运行xwalkview闪退,解决Android中集成XWalkView的奇怪闪退
  11. 抖音快手短视频去水印API,接口开发文档
  12. 【问题记录】git报错:[remote rejected] (pre-receive hook declined)
  13. 跨模态行人重识别:RGB-Infrared Cross-Modality Person Re-Identification 学习记录笔记
  14. 官宣:两校合并,落户省会!
  15. 如何用计算机将分栏的文章合并,在Word文档中给文章段落分栏的方法
  16. 电脑右下角小喇叭出现红色叉号
  17. U盘在别人电脑上正常显示,插在自己电脑读不出来(只显示CD驱动器)
  18. linux_添加一个普通用户
  19. 马云说:“未来是大数据的时代”
  20. 每周网页练习—网易邮箱首页

热门文章

  1. cv2保存的图片是什么?RGB or BGR
  2. 使用cv2实现图片与numpy数组的相互转化
  3. springboot + 操作日志添加
  4. Ubuntu-12.04 OpenStack (Folsom)安装和部署手册
  5. 如何使用ag-Grid
  6. 程序分析过程中遇到疑难问题解决办法
  7. Keil.STM32F1xx_DFP.2.4.0.pack
  8. IOS H5免签绿标 webclip
  9. 热力学统计物理专题:热力学统计物理(I)知识结构
  10. ubuntu 18.04.02 + GTX1660 + CUDA_10.0 + CUDNN_7.6.4 安装脱坑记