quartz

分布式调度任务

有些话、适合烂在心里 提交于 2020-10-29 06:01:41
1什么是分布式任务调度 1.1任务举例-定时任务 1.1.1实际案例 1.1.1.1网贷-日终任务 1.1.1.2其它业务-全日频繁 1.1.1.3 Crontab、shell 1.2产生问题 PK 解决问题 1.2.1迎面遇到第一个问题:集群重复执行 每台虚机在同一时间都会执行定时任务: Tomcat Nginx Tomcat 尝试解决:将任务单独拆出放入一台虚机(TASK)。 Nginx Tomcat TASK Tomcat 产生新的问题: 1.即便TASK 100%可靠永远不宕。也有极大的停机风险,不确定在停机期间是否有任务被遗漏( misfire )。 2.任务更多,更复杂,占越来越多的资源,性能问题凸显,任务队列阻塞风险。 1.2.2Quartz集群 Nginx Tomcat Tomcat DB(quartz) 之后看了眼quartz官方logo,感觉自己萌萌的。 1.2.3管理、调度任务产生问题 萌不过三天。发现这个定时任务策略要修改, 同样,下面这个任务不需要做,取消掉 也无法及时监控:报错了吗,运行成功了吗? 随着业务发展暴露出越来越多的问题: 例如: ---- 截图摘自沈建林“分布式调度系统介绍”中的五个问题 1.2.4解决问题 解决问题 解决问题 集思广益造轮子: Quartz,Xxl-job,elastic-job,tbschedule,uncode

追源码的平凡之路

时光总嘲笑我的痴心妄想 提交于 2020-10-28 13:55:20
在斯坦福大学, 乔布斯做了一场我认为他最精彩的演讲之一 (另一场可能是iphone的问世发布会)。他讲了第一个故事 "connecting the dots" 你不可能充满预见地将生命的点滴串联起来;只有在你回头看的时候,你才发现这些点点滴滴之间的联系。所以,你要坚信,你现在所经历的将在你未来的生命中串联起来。你不得不相信某些东西,你的直觉、命运、生活、因缘际会……正是这种信仰让我不会失去希望,它让我的人生变得与众不同。 什么是连接生命中的点滴呢?我的理解:当一个人的能力还在上升期, 格局和视野还不够广阔的时候,他需要专注当前的事情,并且把每件事情做到他当时的能力所能做到的极限,也许当时没有那么大的成就感,但"蓦然回首,那人却在灯火阑珊处"。 十年前刚进入IT这个行业的时候,我是一个很普通的工程师,脑袋也不灵光,工作老是得不到要领,我的同学智商很高,他看一次代码基本就会写了,我得花很长时间去消化吸收,我对自己能不能在这一行生存下去都产生了质疑。 没有办法,只能勤能补拙,笨鸟先飞, 当遇到问题的时候, 我都抱着死咬不放的心态去寻找最佳解决方案, 洗澡的时候,睡觉的时候,吃饭的时候,甚至上厕所的时候都会去思考。很自然的,"追"源码也成为我程序生命中的一部分。 阅读过很多源码,和大家分享几个对我的职业影响比较大的追源码的经历。 正文 1 Druid 连接池 这是在2013年

Quartz.Net系列(十六):Misfire策略在SimpleScheduler和CronScheduler中的使用

孤人 提交于 2020-10-25 07:07:12
1.场景 ①因为工作线程都在忙碌,所以导致某些Trigger得不到触发 也就是默认10个工作线程而我有15个Trigger同时触发 这就导致有5个不能被触发,而不幸的是Trigger所关联的Job执行时间特别长 如果某些Trigger超过指定的阈值那么就不会触发 ②Scheduler挂掉了。。。某些时刻又恢复了 ③如果你设置的时间早于现在,中有一个StartAt 2.阈值是多少 RAMJobStore默认是5s,DBJobStore是60s 为了统一阈值,在初始化的时候,会读取内置的quartz.config文件,统一设置成60s private TimeSpan misfireThreshold = TimeSpan.FromSeconds( 5 ); quartz.jobStore.misfireThreshold = 60000 3.Misfire的策略 ①错过几次让它立刻执行,后面正常调度 ②错过的几次让他合并成一次执行,后面正常调度 ③忽略错误的次数,正常调度 4.SimpleScheduler怎么使用Mrsfire策略 one IScheduler scheduler= await SchedulerBuilder.Create().Build(); await scheduler.Start(); var job = JobBuilder.Create<MyJob>

Java项目笔记之旅游点评项目总结04

余生颓废 提交于 2020-10-22 08:44:44
不点蓝字,我们哪来故事? Redis操作流程: 预热——初始化:以前在操作Redis中的数据之前,需要判断数据是否存在,存在获取,不存在创建一个(即准备数据)。实际中尽量避免,即操作之前就先将数据准备好; 缓存的逻辑操作:对缓存中的数据做CRUD等操作; 缓存数据的持久化:缓存中的数据被操作之后,数据库中的数据要不要和Redis被写的数据保持同步;读操作不会改变,不需要持久化; 初始化(预热): 凡是用到Redis的都要思考上面的三个步骤 思考: 使用Redis都要想清楚的问题: 需要初始化什么数据 ? 需要频繁改动的数据( DML )[ 此处需要将统计相关的vo数据初始化到Redis中 ] 不需要频繁改动的数据(DQL) 在哪一个项目执行初始化逻辑 ?(mgrsite、website-api) website-api :接口对外暴露,安全性不可保证;website-api后续拓展可能做集群操作,那样就会导致多次执行了初始化操作; 数据初始化数据数据管理范畴,你应该 使用mgrsite 来管理; 在JavaWeb中的哪一个组件中实现初始化逻辑?(filter、servlet、intercept、controller、listener) javaweb监听器:监听web(Tomcat)容器的启动,功能简单; spring容器的监听器 :监听的是spring容器的启动,功能强大

Spring11——Quartz

|▌冷眼眸甩不掉的悲伤 提交于 2020-10-20 04:53:26
Quartz:定时异步任务 任务:做什么事情; 触发器:定义时间; 调度器:将任务、触发器一一对应。 实现步骤(独立使用): 1.jar 2.任务(service):Job 3.测试方法:job、触发器、调度器 scheduler.shutdown(); 立刻关闭 scheduler.shutdown(false); 立刻关闭 scheduler.shutdown(true); 将当前任务执行完毕后再关闭 触发器:CronScheduleBuilder 依赖于Core表达式。 举例: Spring整合Quartz框架: 1.jar :Spring+Quartz 2.调度器-->触发器(job):触发器整合任务,调度器整合触发器。 (1)将job信息封装到一个实体类中; (2)spring配置文件; 来源: oschina 链接: https://my.oschina.net/u/4347613/blog/4328362

xxl-job总体还可以,轻量级,应能满足需求,有几个关键的能力

▼魔方 西西 提交于 2020-10-14 22:57:51
xxl-job总体还可以,轻量级,应能满足需求,有几个关键的能力 1、内部多线程,多任务可在单个执行器上并发执行 2、支持简单的任务依赖关系,工作流 3、支持多语言Java、Shell、Python等 4、支持单实例调度(可以解决业务中台多实例部署的分布式锁问题)、分片调度 5、有界面,支持多租户隔离,每个租户管理自己的执行器,互相不影响 6、问题:普通用户没有权限管理自己的执行器,做成多租户模式需要提前向admin申请分配执行器名称 其他的工作流调度系统,Argo、Airflow、ooize、AZKaban、Luigi、elastic-job、quartz等 其中 Argo是K8S生态的工作流调度新秀,功能非常完善,git活跃度非常高 来源: oschina 链接: https://my.oschina.net/u/4332858/blog/4279865

细数那些使用过的定时器

时光怂恿深爱的人放手 提交于 2020-10-05 23:56:09
前言 何为定时器,说白了就是指定一个延迟时间,到期执行,就像我们早上定的闹铃一样,每天定点提醒我们起床;当然在我们各个系统中也是无处不在,比如定时备份数据,定时拉取文件,定时刷新数据等等;定时器工具也是层出不穷比如Timer,ScheduledExecutorService,Spring Scheduler,HashedWheelTimer(时间轮),Quartz,Xxl-job/Elastic-job等;本文将对这些定时器工具做个简单介绍和对比,都在哪些场景下使用。 Timer Timer可以说是JDK提供最早的一个定时器了,使用简单,功能也相对来说比较简单;可以指定固定时间后触发,固定时间点触发,固定频率触发; Timer timer = new Timer(); timer.schedule( new TimerTask() { @Override public void run () { System.out.println(System.currentTimeMillis() + " === task1" ); } }, 1000 , 1000 ); 时间默认为毫秒,表示延迟一秒后执行任务,并且频率为1秒执行任务;Timer内部使用TaskQueue存放任务,使用TimerThread单线程用来执行任务: private final TaskQueue queue =

一口气说出 6种 延时队列的实现方案,面试稳稳的

时光毁灭记忆、已成空白 提交于 2020-10-03 01:43:27
最强面试题推荐: 2020Java面试题及答案,命中率高达90% 五一期间原计划是写两篇文章,看一本技术类书籍,结果这五天由于自律性过于差,禁不住各种诱惑,我连电脑都没打开过,计划完美宣告失败。所以在这能看出和大佬之间的差距,人家没白没夜的更文,比你优秀的人比你更努力,难以望其项背,真是让我自愧不如。 知耻而后勇,这不逼着自己又学起来了,个人比较喜欢一些实践类的东西,既学习到知识又能让技术落地,能搞出个 demo 最好,本来不知道该分享什么主题,好在最近项目紧急招人中,而我有幸做了回面试官,就给大家整理分享一道面试题:“ 如何实现延时队列? ”。 下边会介绍多种实现延时队列的思路,文末提供有几种实现方式的 github 地址。其实哪种方式都没有绝对的好与坏,只是看把它用在什么业务场景中,技术这东西没有最好的只有最合适的。 一、延时队列的应用 什么是延时队列?顾名思义:首先它要具有队列的特性,再给它附加一个延迟消费队列消息的功能,也就是说可以指定队列中的消息在哪个时间点被消费。 延时队列在项目中的应用还是比较多的,尤其像电商类平台: 1、订单成功后,在30分钟内没有支付,自动取消订单 2、外卖平台发送订餐通知,下单成功后60s给用户推送短信。 3、如果订单一直处于某一个未完结状态时,及时处理关单,并退还库存 4、淘宝新建商户一个月内还没上传商品信息,将冻结商铺等 。。。。

我是怎么读源码的,授之以渔

泄露秘密 提交于 2020-09-30 07:17:06
本文经由博客园作者 青石路 授权转载 原文地址: https://www.cnblogs.com/youzhibing/p/9553752.html 如需转载请联系原作者 读源码的经历 刚参加工作那会,没想过去读源码,更没想过去改框架的源码;总想着别人的框架应该是完美的、万能的,应该不需要改;另外即使我改了源码,怎么样让我的改动生效了?项目中引用的不还是没改的jar包吗。回想起来觉得那时候的想法确实挺…… 工作了一年多之后准备跳槽了,开始了一轮的面试,其中有几个面试官就问到了相关的源码问题: ArrayList、HashMap的底层实现,spring、mybatis的相关源码 。问源码的面试一般就是回去等消息,然后就没然后了。 那时候开始意识到,源码这东西在之前的工作的中感受不到,但是在面试中好像面的还挺频繁的,从此有意识的开始了jdk部分源码的阅读(主要是集合)。一开始看源码,看的特别糙,知道个大概,知道ArrayList的底层实现是数组,HashMap的底层是散列表(数组+链表);更深入一点的扩容、hash碰撞等等就不知道了。 读spring源码起于工作中遇到了一个问题(spring jdbcTemplate事务,各种诡异,包你醍醐灌顶!),排查一段时间最终是解决了,但过程让我非常难受,各种上网查资料、各种尝试,感觉就像大海捞针一样,遥遥无期。我下定决心