【云原生】Nacos-TaskManager 任务管理的使用

简介: 因为Nacos中有很多地方使用了这个TaskManager,所以我们得先了解一下这个类是干啥用的,方便后面阅读源码时候不会吃力;

作者石臻臻, CSDN博客之星Top5Kafka Contributornacos Contributor华为云 MVP ,腾讯云TVP, 滴滴Kafka技术专家KnowStreaming


KnowStreaming  是滴滴开源的Kafka运维管控平台, 有兴趣一起参与参与开发的同学,但是怕自己能力不够的同学,可以联系我,当你导师带你参与开源!

1任务管理类

因为Nacos中有很多地方使用了这个TaskManager,所以我们得先了解一下这个类是干啥用的,方便后面阅读源码时候不会吃力;

先说结论:TaskManager 可以看成是一个待执行的任务集合,用于处理一定要执行成功的任务 单线程的方式处理任务,保证任务一定被成功处理; 如果执行失败了,任务会被重新放入集合中等待下一次被消费;

AbstractTask

AbstractTask是个抽象类,所有的需要被执行的任务都继续这个类; 这个类主要提供执行任务所需要的数据和方法;例如

/* 一个任务两次处理的间隔,单位是毫秒*/
    private long taskInterval;
    /*任务上次被处理的时间,用毫秒表示*/
    private long lastProcessTime;
/* TaskManager 判断当前是否需要处理这个Task,子类可以Override这个函数实现自己的逻辑
     */
    public boolean shouldProcess() {
        return (System.currentTimeMillis() - this.lastProcessTime >= this.taskInterval);
    }

TaskProcessor任务处理器

TaskProcessor 是任务处理器接口,它有个方法

boolean process(String taskType, AbstractTask task);

用于执行对应的AbstractTask任务类; 不同的任务类型,可以实现自己的执行任务逻辑;

TaskManager任务管理类

TaskManager 是个任务管理类; 它里面有两个属性保存了待消费的任务AbstractTask,和任务执行需要的TaskProcessor;

/**待消费的任务AbstractTask**/
private final ConcurrentHashMap<String, AbstractTask> tasks = new ConcurrentHashMap<String, AbstractTask>();
/**任务AbstractTask对应的任务执行器TaskProcessor**/
 private final ConcurrentHashMap<String, TaskProcessor> taskProcessors =new ConcurrentHashMap<String, TaskProcessor>();
如果taskProcessors中没有找到对应的任务执行器,那么它里面有一个默认执行器会执行
 /**默认执行器**/
 private TaskProcessor defaultTaskProcessor;

2使用用例

Nacos配置中心模块很重要一个功能就是,在初始化的时候以及每隔一段时间就会去数据库中把所有数据Dump到磁盘中;Dump就是一个任务类AbstractTask; 我们上面说过AbstractTask就是一个信息承载对象,主要给TaskProcessor提供执行所需要的数据;我们看看DumpTask;

DumpTask

DumpTask定义了自己的一些属性; 再看看其他的例如DumpAllTaskDumpAllBetaTask

网络异常,图片无法展示
|
这两个任务类只定义了TASK_ID 既然有 DumpTask任务类,那肯定就有对应的任务处理器类 DumpProcessor;

DumpProcessor

DumpProcessor 是DumpTask任务的执行器;执行器中的方法

public boolean process(String taskType, AbstractTask task)

代码太长就不在这里分析了,它里面主要做的操作就是  保存配置文件到本地磁盘中,并缓存md5详细可以看文章 【Nacos源码之配置管理 四】DumpService如何将配置文件全部Dump到磁盘中

对应DumpAllTaskDumpAllBetaTask 任务的任务执行器有DumpAllProcessorDumpAllBetaProcessor

3DumpAllTask任务触发执行的地方

上面是DumpAllTask的定义和DumpAllTaskProcessor执行器的定义;定义好了之后是怎么被触发的呢?

DumpService初始化Dump配置信息

这个类就是专门Dump配置信息的服务类;上面提及的DumpAll就是在这里被调用的;我们来看下他主要方法;

@PostConstruct
    public void init() {
        DumpAllProcessor dumpAllProcessor = new DumpAllProcessor(this);
      /**在new这个TaskManager类的时候,专门执行任务的一个线程就已经开始启动了,这不过这个时候还没有任务Task添加进去**/
       dumpAllTaskMgr = new TaskManager( "com.alibaba.nacos.server.DumpAllTaskManager");
dumpAllTaskMgr.setDefaultTaskProcessor(dumpAllProcessor);
      Runnable dumpAll = new Runnable() {
            @Override
            public void run() {
dumpAllTaskMgr.addTask(DumpAllTask.TASK_ID, new DumpAllTask());
            }
        };
            /**每10分钟执行一次DumpAll操作**/
      TimerTaskService.scheduleWithFixedDelay(dumpAll, initialDelay, DUMP_ALL_INTERVAL_IN_MINUTE,
                TimeUnit.MINUTES);
    }

DumpService在初始化的时候回调用这个init方法; 1.先new了一个DumpAllProcessor执行器; 2.再new 了一个TaskManager任务管理器;在new这个任务管理器的时候,就会启动一个线程专门去执行所有待执行的任务;只不过这个时候还没有添加任务; 3.将这个任务管理器的默认执行器设置为DumpAllProcessor; 4.每十分钟执行一次往TaskManager中添加一个DumpAllTask的任务;一经添加就会被TaskManager中的线程 processingThread  执行process方法;

目录
相关文章
|
easyexcel Java 测试技术
读取Excel还用POI?试试这款开源工具EasyExcel
读取Excel还用POI?试试这款开源工具EasyExcel
426 0
|
Go Python
安装程序报2503/2502问题的解决
安装程序报2503/2502问题的解决
703 0
安装程序报2503/2502问题的解决
|
3月前
|
人工智能 自然语言处理 数据安全/隐私保护
AI生成的文本:如何识破机器的“笔迹”?
AI生成的文本:如何识破机器的“笔迹”?
602 85
|
编译器
overleaf 参考文献引用,创建引用目录.bib文件,在文档中引用参考文献,生成参考文献列表
overleaf 参考文献引用,创建引用目录.bib文件,在文档中引用参考文献,生成参考文献列表
9786 0
|
2月前
|
存储 弹性计算 API
阿里云服务器带宽怎么选择?带宽值选多少兆合适?
阿里云服务器带宽如何选?轻量应用选1-5M,中小型网站建议5-20M,视频、下载等高并发场景建议50M以上。可结合CDN、OSS和弹性公网IP优化成本与性能,按实际流量或固定带宽计费,灵活调整更省钱。
349 6
|
12月前
|
传感器 人工智能 大数据
高科技生命体征探测器、情绪感受器以及传感器背后的大数据平台在健康监测、生命体征检测领域的设想与系统构建
本系统由健康传感器、大数据云平台和脑机接口设备组成。传感器内置生命体征感应器、全球无线定位、人脸识别摄像头等,搜集超出现有科学认知的生命体征信息。云平台整合大数据、云计算与AI,处理并传输数据至接收者大脑芯片,实现实时健康监测。脑机接口设备通过先进通讯技术,实现对健康信息的实时感知与反馈,确保身份验证与数据安全。
|
数据采集 存储 数据可视化
R语言时间序列分析:处理与建模时间序列数据的深度探索
【8月更文挑战第31天】R语言作为一款功能强大的数据分析工具,为处理时间序列数据提供了丰富的函数和包。从数据读取、预处理、建模到可视化,R语言都提供了灵活且强大的解决方案。然而,时间序列数据的处理和分析是一个复杂的过程,需要结合具体的应用场景和需求来选择合适的方法和模型。希望本文能为读者在R语言中进行时间序列分析提供一些有益的参考和启示。
|
关系型数据库 MySQL PHP
免登录游客卡密发放系统PHP网站源码
这是一个简单易用的卡密验证系统,主要功能包括: 卡密管理和验证,多模板支持,响应式设计,验证码保护,防刷机制,简洁的用户界面, 支持自定义模板,移动端优化,安全性保护,易于部署和维护。
652 77
|
11月前
|
人工智能 计算机视觉
YOLOv11改进策略【损失函数篇】| NWD损失函数,提高小目标检测精度
YOLOv11改进策略【损失函数篇】| NWD损失函数,提高小目标检测精度
1414 9
|
10月前
|
存储 人工智能 NoSQL
通过MongoDB Atlas 实现语义搜索与 RAG——迈向AI的搜索机制
MongoDB Atlas 的向量搜索功能为语义搜索和 RAG 提供了一个高效的数据库管理平台。在这个全新的应用场景下,Atlas 的向量检索能力支持开发者实现高效的知识检索和增强型生成应用,使其在智能客服、知识问答、个性化推荐等场景中大放异彩。结合生成式模型的 RAG 应用,MongoDB Atlas 提供了从数据存储到智能生成的完整解决方案,展现出其在现代应用中的巨大潜力。希望本文能够帮助大家更好地理解 MongoDB Atlas 的语义搜索功能和 RAG 的实际应用。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点
通过MongoDB Atlas 实现语义搜索与 RAG——迈向AI的搜索机制