对于写得很烂的电商系统,只要运行一段时间,服务器就会出现Out Of Memory。有一次偶然发现了JDK中的Timer类,似乎也是做这些定时任务的。不由地眼前一亮,但是仔细研究以后就发现,JDK的Timer还是太简单了。做点简单的定时任务还行, 对于复杂的情况,尤其是复杂的时间策略,还是力不从心,这时,你需要设计一款任务调度系统。
这个Trigger 可以指定什么时间开始,时间间隔,运行多少次, 能覆盖大部分需求了,可是转念一想,如果有人要求类似日历的重复间隔该怎么处理? 比如每月的第一天运行,或者每周的最后一天运行,该怎么办,crontab特别适合描述这种情况,对,可以搞一个类似于crontab的Trigger,那就需要从头设计了, 用“正交”的原则设计出了Logger, Appender, Formatter这些类。
先想想需求,非常简单,不就是定时地执行任务嘛,“任务”应该是正交中的一个“维度”,我可以抽象出一个接口叫做Task , 嗯,还是叫做Job吧,对使用者来说,他需要提供一个实现类出来。在实现类中描述要做什么事情,比如:生成报表,复制数据。
“定时”该怎么处理, 定时,定时触发,干脆叫做Trigger吧。看来Trigger最好也是个接口。我来提供几个默认的实现,比如SimpleTrigger,CronTrigger,用户还可以扩展,这样就灵活了,Job和Trigger也是正交的关系, 两者可以互不影响,可以独立扩展,真是不错。 不仅得意起来,这设计也很简单嘛!但是怎么把这两个家伙结合起来,必须得有个“大管家”才行。这个大管家应该可以接受Job, 然后按照各种Trigger去运行,嗯,叫做调度器Scheduler应该不错。
如何实现持久化呢,不敢怠慢,赶紧进行新的设计, 他抽象了一个叫做JobStore的接口。表示Job的存储,像什么Job,Trigger, Job运行情况都存储在其中,下面有两个实现,分别对应内存存储和数据库存储。虽然SQL是标准的,但是不同的数据库还是有细微的差异, 觉得得把这些差异给封装起来。他又提取了一个接口叫做DriverDelegate, 屏蔽了数据库细节,让DbJobStore使用,还提供了一个缺省的实现StdJDBCDelegate,如果那些数据库还有独特的实现,那就写个子类就行了。
这就是本篇文章关于如何设计一款任务调度系统的简单介绍了。
更多产品了解
欢迎扫码加入云巴巴企业数字化交流服务群
产品交流、问题咨询、专业测评
都在这里!
1月16日,2025腾讯产业合作伙伴大会在三亚召开。云巴巴,荣膺“2024腾讯云卓越合作伙伴奖—星云奖”和“2024腾讯云AI产品突出贡献奖”双项大奖
Testin云测自动化测试解决方案,以零代码降低门槛、全栈兼容打破生态壁垒、云端集约提升资源效能,助力企业跨越测试鸿沟,赢在数智化时代。
如何构建安全合规、敏捷高效的研发管理体系,已成为金融业高质量发展的关键命题。
腾讯TAPD正在凭借着三大亮点帮助众多互联网企业打破传统管理模式的束缚,实现更加透明、高效的协作。
云巴巴基于多年行业深耕,为大家推荐洞隐科技的智能航运管理平台,为企业开启“智慧航海”新篇章——这不仅是技术的升级,更是一场管理模式的革新。