最新源码分析ElasticJob任务运行事件监听器,某大厂开发者对于Java多线程的总结

总结

总的来说,面试是有套路的,一面基础,二面架构,三面个人。

最后,小编这里收集整理了一些资料,其中包括面试题(含答案)、书籍、视频等。希望也能帮助想进大厂的朋友

三面蚂蚁金服成功拿到offer后,他说他累了

三面蚂蚁金服成功拿到offer后,他说他累了

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

代码@1:使用GuaranteeService注册分片开始。

代码@2:判断该任务所有的分片是否都已经注册启动,如果都注册启动,则调用doBeforeJobExecutedAtLastStarted()方法。

代码@3:获取服务器当前时间。

代码@4:利用startWait.wait(startedTimeoutMilliseconds)带超时时间的等待,这里如何唤醒呢?

代码@5:判断唤醒是超时唤醒还是正常唤醒,如果是超时唤醒,清除所有的分片注册启动信息,处理超时异常。

上述流程简单明了,上面有两个问题需要进一步探究,如何注册分片启动信息与如何被唤醒。

1、任务节点注册分配给当前节点的任务分片

/**

  • 根据分片项注册任务开始运行.

  • @param shardingItems 待注册的分片项

*/

public void registerStart(final Collection shardingItems) {

for (int each : shardingItems) {

jobNodeStorage.createJobNodeIfNeeded(GuaranteeNode.getStartedNode(each));

}

}

创建持久节点:${namespace}/jobname/guarantee/started/{item}。

2、当最后一个节点注册启动执行doBeforeJobExecutedAtLastStarted方法后,如果唤醒其他节点以便进入到任务执行阶段

if (guaranteeService.isAllStarted()) {

doBeforeJobExecutedAtLastStarted(shardingContexts);

guaranteeService.clearAllStartedInfo();

return;

}

也就是回调函数执行完毕后,会删除任务所有的分片。温馨提示:业务实现子类实现doBeforeJobExecutedAtLastStarted方法时最好不要抛出异常,不然各节点的唤醒操作只能是等待超时后被唤醒。

GuaranteeService#clearAllStartedInfo

/**

  • 清理所有任务启动信息.

*/

public void clearAllStartedInfo() {

jobNodeStorage.removeJobNodeIfExisted(GuaranteeNode.STARTED_ROOT);

}

直接删除 n a m e s p a c e / j o b n a m e / g u a r a n t e e / s t a r t e d 根节点。基于 Z K 的开发模式,触发一次删除操作,肯定会有事件监听器来监听该节点的删除事件,从而触发其他节点的唤醒操作,果不奇然, E l a s t c i J o b 提供 G u a r a n t e e L i s t e n e r M a n a g e r 事件监听来监听 {namespace}/jobname/guarantee/started根节点。基于ZK的开发模式,触发一次删除操作,肯定会有事件监听器来监听该节点的删除事件,从而触发其他节点的唤醒操作,果不奇然,ElastciJob提供GuaranteeListenerManager事件监听来监听 namespace/jobname/guarantee/started根节点。基于ZK的开发模式,触发一次删除操作,肯定会有事件监听器来监听该节点的删除事件,从而触发其他节点的唤醒操作,果不奇然,ElastciJob提供GuaranteeListenerManager事件监听来监听{namespace}/jobname/guarantee/started节点的删除事件。

GuaranteeListenerManager$StartedNodeRemovedJobListener

class StartedNodeRemovedJobListener extends AbstractJobListener {

@Override

protected void dataChanged(final String path, final Type eventType, final String data) {

if (Type.NODE_REMOVED == eventType && guaranteeNode.isStartedRootNode(path)) {

for (ElasticJobListener each : elasticJobListeners) {

if (each instanceof AbstractDistributeOnceElasticJobListener) {

((AbstractDistributeOnceElasticJobListener) each).notifyWaitingTaskStart();

}

}

}

}

}

每个Job实例在监听到${namespace}/jobname/guarantee/started节点被删除后,会执行AbstractDistributeOnceElasticJobListener的notifyWaitingTaskStart方法唤醒被阻塞的线程,是线程进入到任务执行阶段。

同理,任务执行后监听方法afterJobExecuted的执行流程实现原理一样,在这里就不在重复讲解了。


见文如面,我是威哥,热衷于成体系剖析JAVA主流中间件,关注公众号『中间件兴趣圈』,回复专栏可获取成体系专栏导航,回复资料可以获取笔者的学习思维导图。
在这里插入图片描述

Kafka进阶篇知识点

image

Kafka高级篇知识点

image

44个Kafka知识点(基础+进阶+高级)解析如下

image

由于篇幅有限,小编已将上面介绍的**《Kafka源码解析与实战》、Kafka面试专题解析、复习学习必备44个Kafka知识点(基础+进阶+高级)都整理成册,全部都是PDF文档**

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)收录**

需要这份系统化的资料的朋友,可以点击这里获取

  • 23
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值