quartz

MYSQL定时任务-定时清除备份数据

♀尐吖头ヾ 提交于 2020-05-01 18:21:27
背景 由于项目需要,每个月的历史存量数据需要进行一个归档和备份操作,以及一些日志表需要进行一个明细字段清除,让mysql数据库磁盘节省空间。则需要一些定时任务来定时清理这些数据。 技术选型 Java 可以基于Quartz/Timer来使用定时任务机制来编写定时任务,需要依赖于Java程序 基于Linux下Crontab来基于cron表达式构建定时任务 文档 必定需要编写对应的脚本,但是在这个脚本中,由于需要操作数据库,必定会涉及到明文密码这样的一个数据,这样不是很安全。 由于使用到的是MYSQL数据库,而MYSQL又支持定时任务,所以可以使用MYSQL自带定时任务。 具体操作 mysql配置 由于定时任务这个选项在mysql的默认配置是关闭的,所以保险起见,我们先查询一下该选项是否打开 show variables like '%event_scheduler%'; 如果显示的为 Off 选项,有提供如下两种方式对其进行修改 ​ 1. 语句方式(当前启动的实例有效,重启后无效) set global event_scheduler=1; ​ 2. 配置my.cnf(windows下是my.ini)下添加如下选项 [mysqld] event_scheduler=ON 然后将其保存后重启mysql即可 sql编写 创建存储过程(procedure)[可选

将定时任务cron 解析成中文

拜拜、爱过 提交于 2020-05-01 17:23:53
在使用定时器 quartz 时,其中的cron 表达式,老板表示作为开发的你能看懂外,其他的非开发同事可能看不懂,要用一个他们能看懂的方式表达出来。 还好我们的项目要求的表达式不是特别的麻烦,所以就写了一个简略的转换为中文的方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148

时间轮算法 — 转

非 Y 不嫁゛ 提交于 2020-05-01 15:09:44
出处: 那些惊艳的算法们(三)—— 时间轮 从定时任务说起   自然界中定时任务无处不在,太阳每天东升西落,候鸟的迁徙,树木的年轮,人们每天按时上班,每个月按时发工资、交房租,四季轮换,潮涨潮落,等等,从某种意义上说,都可以认为是定时任务。 大概很少有人想过,这些“定时”是怎样做到的。当然,计算机领域的同学们可能对此比较熟悉,毕竟工作中的定时任务也是无处不在的:每天凌晨更新一波数据库,每天9点发一波邮件,每隔10秒钟抢一次火车票。。。   至于怎么实现的?很简单啊,操作系统的crontab,spring框架的quartz,实在不行Java自带的ScheduledThreadPool都可以很方便的做到定时任务的管理调度。   当你熟练的敲下“* * 9 * * ?”等着神奇的事情发生时,你是否想过背后的“玄机”? 初识时间轮 大概去年的时候,业务需要实现一个时间调度的工具,定时生成报表,同组的哥们儿想了一个取巧的办法:   1. 启动时从DB读取cron表达式解析,算出该任务下次执行的时间。   2. 下次执行的时间 - 当前时间 = 时间差。   3. 向ScheduleThreadPool线程池中提交一个延迟上面算出来的时间差的执行的任务。   4. 任务执行时,算一下这个任务下次执行的时间,算时间差,提交到线程池。   5. 当任务需要取消时

解析Cron表达式

天大地大妈咪最大 提交于 2020-05-01 15:08:25
1.引入 有些时候我们不但需要定时执行任务,而且需要获得下一次执行的时间。 但是我们执行时间配置的是cron表达式,不能够根据上次执行的时间+执行间隔这种方式来获得。所以我们必须要解析cron 2.方法 Date curTime = new Date(); System.out.println(curTime); CronExpression expression; try { expression = new CronExpression( "0 30 15 * * ?"); Date newDate = expression.getNextValidTimeAfter(curTime); System.out.println(newDate); } catch (ParseException e) { logger.error( "fail to parse cron express", e); } catch (Exception e) { logger.error( "fail to update rule nextTime", e); } 结果为: Wed Jun 24 19:11:52 CST 2015 Thu Jun 25 15:30:00 CST 2015 说明: (1)当然需要引入Quartz的依赖 < dependency> < groupId>org

.Net Core 商城微服务项目系列(十五): 构建定时任务调度和消息队列管理系统

放肆的年华 提交于 2020-04-28 05:54:12
一.系统描述 嗨,好久不见各位老哥,最近有点懒,技术博客写的太少了,因为最近在写小说,写的顺利的话说不定就转行了,哈哈哈哈哈哈哈哈哈。 今天要介绍的是基于.Net Core的定时任务调度和消息队列管理系统。相信大家对这两个肯定都已经很熟悉了,在开发过程中,这两个组件扮演了不可或缺的角色: 消息队列帮助我们进行 ”解耦“、”异步“、”削峰“ 定时任务帮助我们进行 "后台"、”监控"、“补偿" 定时任务调度系统大家都介绍过很多次了,园子里的很多文章我也都拜读过,我相信大家实际的工作中肯定也都在频繁的使用它。目前主流的组件有 Quartz和Hangfire两种,在两者的选择上来说建议大家熟悉哪个用哪个就可以,Hangfire是自带UI管理界面的,所以如果想直接接入系统并且不想再进行二次开发做UI,可以直接选择Hangfire。 因为我对于Quartz更熟悉,所以本系统的定时任务调度基于Quartz开发,消息队列基于RabbitMQ,同时有一套UI,用于可视化操作定时任务调度和管理消息队列配置。 本系统是开发自用的,原型是公司工作中使用的系统,私下里重写了一套后台代码,但是UI还是公司的那一套,因为是自用,所以无法达到直接开箱即用的效果,写这篇的目的只是希望分享两者的使用方式和场景,帮助各位在遇到相同应用场景的问题时能够有更多解决思路。 二.功能介绍 1.MQ界面化动态配置

coding++:@DisallowConcurrentExecution 注解的作用

左心房为你撑大大i 提交于 2020-04-27 09:03:48
Quartz定时任务默认都是并发执行的,不会等待上一次任务执行完毕,只要间隔时间到就会执行, 如果定时任执行太长,会长时间占用资源,导致其它任务堵塞。 在Spring中这时需要设置concurrent的值为false, 禁止并发执行。 <property name="concurrent" value="true" /> 当不使用spring的时候就需要在Job的实现类上加@DisallowConcurrentExecution的注释 @DisallowConcurrentExecution 禁止并发执行多个相同定义的JobDetail, 这个注解是加在Job类上的, 但意思并不是不能同时执行多个Job, 而是不能并发执行同一个Job Definition(由JobDetail定义), 但是可以同时执行多个不同的JobDetail, 举例说明,我们有一个Job类,叫做SayHelloJob, 并在这个Job上加了这个注解, 然后在这个Job上定义了很多个JobDetail, 如sayHelloToJoeJobDetail, sayHelloToMikeJobDetail, 那么当scheduler启动时, 不会并发执行多个sayHelloToJoeJobDetail或者sayHelloToMikeJobDetail,

Springboot+SpringCloud项目脚手架

时间秒杀一切 提交于 2020-04-24 13:35:45
系统介绍 spring-cloud-plus 是以spring-cloud-alibaba为基础并整合一些常用框架的分布式基础开发平台。 项目以组件模块的方式构建,实现项目模块可插拔组装。工作中遇到的一些常用框架,我都会整合到此项目,并持续更新。 项目地址 https://gitee.com/gourd-hu/spring-cloud-plus https://github.com/hxnlyw/spring-cloud-plus 目标 成为一个简单易用、快速高效、功能丰富、安全稳定的分布式项目脚手架。 让每个人都可以独立、快速、高效地开发一套分布式项目! 技术架构图 技术栈 基础:springboot + springcloud 持久化:MybatisPlus 连接池:Druid 数据库:Mysql 项目构建:Maven API网关: Gateway 日志:Logback 注册、配置中心: Nacos 服务调用: Feign + Ribbon 熔断、降级:Sentinel 分布式事务:Seata 分布式锁:Redisson 鉴权: Shiro + jwt-token 缓存: Redis、springCache 工作流:Activiti 定时任务: Quartz 消息中间件:ActiveMq 文件操作:FastDFS、EasyExcel 搜索存储引擎:Elasticsearch

【半译】在ASP.NET Core中创建内部使用作用域服务的Quartz.NET宿主服务

可紊 提交于 2020-04-23 10:33:39
在我的 上一篇文章中 ,我展示了如何使用ASP.NET Core创建Quartz.NET托管服务并使用它来按计划运行后台任务。不幸的是,由于Quartz.NET API的工作方式,在Quartz作业中使用Scoped依赖项注入服务有些麻烦。说明下这篇文章部分采用机翻。 作者:依乐祝 译文地址: https://www.cnblogs.com/yilezhu/p/12757411.html 原文地址: https://andrewlock.net/using-scoped-services-inside-a-quartz-net-hosted-service-with-asp-net-core/ 在这篇文章中,我将展示一种简化工作中使用Scoped服务的方法。您可以使用相同的方法来管理EF Core的 工作单元模式 和其他面向切面的模型。 这篇文章是 上篇文章 引申出来的,因此,如果您还没有阅读的话,建议您先阅读上篇文章。 回顾-自定义JobFactory和单例的IJob 在上篇博客的最后,我们有一个实现了 IJob 接口并向控制台简单输出信息的 HelloWorldJob 。 public class HelloWorldJob : IJob { private readonly ILogger<HelloWorldJob> _logger; public

阿里面试官让我实现一个线程安全并且可以设置过期时间的LRU缓存,我蒙了!

痴心易碎 提交于 2020-04-23 02:09:31
[TOC] 最近被面试阿里的读者问到“不用LinkedHashMap的话,如何实现一个线程安全的 LRU 缓存?网上的代码太杂太乱,Guide哥哥能不能帮忙写一个?”。 相关阅读: V2.0 版本的 《JavaGuide面试突击版》来啦!带着它的在线阅读版本来啦! 划重点,手写一个 LRU 缓存在面试中还是挺常见的! 很多人就会问了:“网上已经有这么多现成的缓存了!为什么面试官还要我们自己实现一个呢?” 。咳咳咳,当然是为了面试需要。哈哈!开个玩笑,我个人觉得更多地是为了学习吧!今天Guide哥教大家: 实现一个线程安全的 LRU 缓存 实现一个线程安全并且带有过期时间的 LRU 缓存 考虑到了线程安全性我们使用了 ConcurrentHashMap 、 ConcurrentLinkedQueue 这两个线程安全的集合。另外,还用到 ReadWriteLock (读写锁)。为了实现带有过期时间的缓存,我们用到了 ScheduledExecutorService 来做定时任务执行。 如果有任何不对或者需要完善的地方,请帮忙指出! 1. LRU 缓存介绍 LRU (Least Recently Used,最近最少使用)是一种缓存淘汰策略。 LRU缓存指的是当缓存大小已达到最大分配容量的时候,如果再要去缓存新的对象数据的话,就需要将缓存中最近访问最少的对象删除掉以便给新来的数据腾出空间。

Quartz2.x动态Job工具类

血红的双手。 提交于 2020-04-22 08:21:59
有些需求,需要动态启动一个定时器,然后在一定条件下再停止。比如通过rest控制jenkins做发布,当发起一个构建后,就需要定时去查询构建状态,在构建完成后再停止定时器,下面是一个通用的定时器工具类。 pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.scc</groupId> <artifactId>stu-quartz</artifactId> <version>0.0.1-SNAPSHOT</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.9.RELEASE</version> <relativePath />