我们到底能走多远系列47
扯淡:
又是一年新年时,不知道上一年你付出了多少,收获了多少呢?也许你正想着老板会发多少奖金,也许你正想着明年去哪家公司投靠。
这个时间点好好整理一下,思考总结一下,的确是个非常好的机会。
年终的时候各个公司总会评一下绩效,拉出各位的成绩单,你是不是想说:去你妈的成绩单,我不是你的学生,老子努力工作不是为了看你脸色!当然啦,你想说这话的前提是:你很牛b,如果不是也可以想想,然后默默去变牛b。
我大多数的朋友同事都是漂在城市里的人,我们努力的活得更好,想过自己想过的生活,打心里佩服我们自己,选择这个行业,正尝试改变着世界。
所以,加油,各位!
另外,程序员过什么新年?写bug的时间都不够呢!
最后还是祝看到这个文字的朋友:身体健康,阖家欢乐,鸡年大吉,公司上市。
主题:
一般,开一个定时任务很简单,spring写个注解就能跑了,或者单应用的定时任务还有很多其他丰富jar支持。
常规的一个场景:
一个系统一般都会有很多业务模块组成,这些业务模块被封装成一个个独立部署的应用拆分出去,独立维护。各个业务模块都会有自己定制的定时任务要跑,一般都会依赖自己业务数据和逻辑,很自然的写在鸽子应用中。
那么定时任务管理中心要做的是统一管理这些散落在各个业务模块中的定时任务。
统一管理的好处是:
1,全系统定时任务一目了然,便于排查
2,任务执行相关信息统一到一起,比如日志,而任务业务代码开发和任务配置解耦
3,针对任务功能的开发升级集中到一个应用中了
这里粗略设计一个定时任务管理系统抛砖引玉。
大致划分以下三个部分:
1,任务管理系统
2,任务调度系统
3,业务实现的任务逻辑
任务管理系统用于配置任务的一些信息,任务调度使用这些信息实现对业务系统进行调度,实现定时任务。
任务管理系统用于配置任务的一些信息,任务调度使用这些信息实现对业务系统进行调度,实现定时任务。
拆解后各个组件的关系如下:
当然,为了跟好的描述这个系统,以上图是一个简化的设计图。
如何实现呢?
这里提供一个代码的方案,实际开发中结合实际场景和当时技术遗产还有很多的技术方案可以设计,还可以深度挖掘。
首先我们给每个应用提供任务管理中心的jar包,在业务应用启动的时候我们要把任务service收集起来,放入一个map,然后统一提供出一个dubbo接口,用dubbo的group区分各个应用。当任务调度需要调用到这个应用的某个任务service时,再从map中拿出spring bean执行任务方法。
以上功能的jar的核心代码如下:
public class TaskSupport implements BeanPostProcessor, ApplicationListener<ApplicationContextEvent>, ApplicationContextAware { private static final Logger logger = LoggerFactory.getLogger(TaskSupport.class); private ApplicationContext applicationContext; private RegistryConfig registryConfig; private ApplicationConfig applicationConfig; private ProtocolConfig protocolConfig; // 存储任务bean