马克·扎克伯格|Java通过DelayQueue实现的延迟任务队列调度服务
【马克·扎克伯格|Java通过DelayQueue实现的延迟任务队列调度服务】
文章图片
文章图片
文章图片
背景在我们的系统中 , 有些时候需要用到一些延迟任务 , 比如我们的系统A依赖于另外一个系统B , 只有这两个系统建立连接后 , 才能进行业务操作 。系统A把一些策略运行所需的参数、环境、指标数据发给B ,B进行策略服务运行 , 获取结果后通知系统A 。系统A在与系统B建立连接后首先发送一些基础的系统参数 , 然后才可以发送正常的业务数据 。所以要求我们在两个系统建立连接成功后 , 稍微延迟一点时间发送系统参数 。其中原因是:系统建立成功后 , 系统A立即发送参数 , 系统B有时候会收不到 , 因为系统连接基于tcp建立连接后进行一些认证、初始化环境操作 , 所以tcp连接成功后 , 业务系统的环境还没有准备好 。因此我们需要引入一个延迟任务调度服务 , 在监听到连接成功后 ,创建一个延迟任务 , 放入队列里面 , 然后进行调度运行 。
因为对延迟任务调度队列要求很简单 , 不需要做故障恢复、数据持久等安全性保障 , 所以就引入了单机版的任务调度服务实现 。我们第一版本基于java提供的DelayQueue实现 , 后续有第二版本支持任务持久化、故障恢复、分布式等操作 。本文先介绍基于DelayQueue怎么实现一个延迟任务调度服务 。
实现首先定义一个抽象延迟任务类AbstractDelayedTask ,具体要实现的延迟任务通过继承该类就可以被调度 。
延迟调度服务实现类DelayScheduleService ,该类通过DelayQueue实现延迟任务的调度运行 。
用例在springMvc里面直接声明一个bean对象 , 如下:
特别需要注意的是:配置该bean的3个属性 , 如下:
init-method=\"init\"
destroy-method=\"shutdown\"
scope=\"singleton\"
声明一个延迟任务实现类
该任务类继承AbstractDelayedTask , 实现其抽象方法process()
在需要的地方 , 把该延迟任务放入到队列里面去 , 如下:
logger.info(\"=======>scenarioDiscoveryStatus==== 已连接交易系统\");
//加入延迟任务 , 默认10s , 具体可以在实现类里面定制 , 也可以通过构造函数指定
delayScheduleService.put(new DelaySendControlRuleTask(controlRuleConfigService));
这样就完成了一个延迟任务调度服务了 , 使用非常简单 。
缺点第一版本实现的比较简陋 ,时间精度不细致、不支持故障恢复、 不支持数据持久化、不支持分布式 , 适用于系统对延迟要求比较低 , 任务延迟精度低的场景下使用 。其他场景须慎用 。
推荐阅读
- 马克·扎克伯格|员工删Facebook上热搜:扎克伯格人设崩塌,中美企业差距
- 安格拉·默克尔|让美国失望了!默克尔、马克龙对华作出重要表态,传递信息不简单
- 社会的观众|扎克伯格“道歉”了!,“删除Facebook”一词登上美国热搜
- Facebook|扎克伯格认错了!“删除Facebook”登上美国热搜
- IT之家|Store收取“垄断租金”,扼杀了创新,扎克伯格:苹果App
- 杭州|扎克伯格惹的祸?捏造谎言引发白宫恐慌,只因TikTok在美完爆脸书
- 少年一梦|网友:“脸书”干脆叫“书”好了,TikTok的下场有扎克伯格的“功劳”
- ZAKER生活|梅根·马克尔和哈里王子正在向好莱坞推销一项“秘密”计划,脱离王室不容易
- 大数据文摘|大数据之父舍恩伯格又有什么新预测?,2020年了
- 马克·扎克伯格|借口“威胁用户数据安全”发难TikTok?现在,扎克伯格尴尬了