TBSchedule源码学习笔记-任务处理

淘宝定时任务 tbschedule实战 说明: tbschedule项目其实可以分为两部分: 1)schedule管理控制台。负责控制、监控任务执行状态2)实际执行job的客户端程序。在实际使用时,首先要启动zookeeper, 然后部署tbschedule web界面的管理控制台,最后启动实际执行job的客户机器。这里zookeeper并不实际控制任务调度,它只是负责与N台执行job的客户端通讯,协调、管理、监控这些机器的运行信息 阅读详情

上回说到每个线程组会创建自己的com.taobao.pamirs.schedule.taskmanager.TBScheduleManager实例来管理线程组,一个JVM中该实例的个数与结合调度机数目分配給JVM的数目一致。TBScheduleManager实例中会计算调度任务的启动时机(与控制台界面设置保持一致)。实际开发一个调度任务按框架要求需要实现com.taobao.pamirs.schedule.IScheduleTaskDealMulti或com.taobao.pamirs.schedule.IScheduleTaskDealSingle接口。接着上边的启动过程来。
之前有说道:

这里使用的“开启服务”和“暂停服务”,分别使用了com.taobao.pamirs.schedule.taskmanager.TBScheduleManager类的public void resume(String message) throws Exception方法以及public void pause(String message) throws Exception方法

那么就接着打开看看public void resume(String message) throws Exception 方法,毕竟他是控制了一个线程组的启动。每当到达调度时间(开始执行时间)都会调用该方法。


/**
     * 处在了可执行的时间区间,恢复运行
     * @throws Exception 
     */
    public void resume(String message) throws Exception{
        if (this.isPauseSchedule == true) {
            if(log.isDebugEnabled()){
                log.debug("恢复调度:" + this.currenScheduleServer.getUuid());
            }
            this.isPauseSchedule = false;
            this.pauseMessage = message;
            if (this.taskDealBean != null) {
                if (this.taskTypeInfo.getProcessorType() != null &&
                    this.taskTypeInfo.getProcessorType().equalsIgnoreCase("NOTSLEEP")==true){
                    this.taskTypeInfo.setProcessorType("NOTSLEEP");
                     = new TBScheduleProcessorNotSleep(this,
                            taskDealBean,this.statisticsInfo);
                }else{
                    this.processor = new TBScheduleProcessorSleep(this,
                            taskDealBean,this.statisticsInfo);
                    this.taskTypeInfo.setProcessorType("SLEEP");
                }
            }
            rewriteScheduleInfo();
        }
    }   

大佬们说常用SLEEP模式,所以这里主要看对SLEEP 模式的处理,可见这里判断任务设置如果为sleep模式,则创建一个com.taobao.pamirs.schedule.taskmanager.TBScheduleProcessorSleep<T>实例。这里创建这个实例赋值给了TBScheduleManager的一个全局变量,这个processor被拿去做了些什么,难道是利用他启动了一些线程?毕竟我这设置了好多的线程项,应该是在这里selectTask并对数据分片的吧?所以先去看processor被拿去干什么用了。找了一圈发现以下几个操作

/**
     * 当服务器停止的时候,调用此方法清除所有未处理任务,清除服务器的注册信息。
     * 也可能是控制中心发起的终止指令。
     * 需要注意的是,这个方法必须在当前任务处理完毕后才能执行
     * @throws Exception 
     */
    public void stop(String strategyName) throws Exception{
        //.........//
            this.processor.stopSchedule();
        //.........//
    }
/**
     * 清除内存中所有的已经取得的数据和任务队列,在心态更新失败,或者发现注册中心的调度信息被删除
     */
    public void clearMemoInfo(){
        //.........//
                this.processor.clearAllHasFetchData();
        //.........//
    }
/**
     * 超过运行的运行时间,暂时停止调度
     * @throws Exception 
     */
    public void pause(String message) throws Exception{
        //.........//
                this.processor.stopSchedule();
        //.........//
    }

好吧好像都是一些要求释放资源的操作,并没有开启所以到这里有一种不详的预感“是不是又在构造函数里开线程了?!”,带着疑问打开TBScheduleProcessorSleep类的代码。嗯,看到了关键字 startThread 看来在这个类里启动线程无疑了。

/**
     * 创建一个调度处理器 
     * @param aManager
     * @param aTaskDealBean
     * @param aStatisticsInfo
     * @throws Exception
     */
    public TBScheduleProcessorSleep(TBScheduleManager aManager,
            IScheduleTaskDeal<T> aTaskDealBean, StatisticsInfo aStatisticsInfo) throws Exception {
        //线程组管理器
        this.scheduleManager = aManager;
        this.statisticsInfo = aStatisticsInfo;
        //任务配置信息
        this.taskTypeInfo = this.scheduleManager.getTaskTypeInfo();
        //通过控制台设置的bean
        this.taskDealBean = aTaskDealBean;
         //加载调度任务(实现IScheduleTaskDealMulti或IScheduleTaskDealSingle的区别)
        if (this.taskDealBean instanceof IScheduleTaskDealSingle<?>) {
            if (taskTypeInfo.getExecuteNumber() > 1) {
                taskTypeInfo.setExecuteNumber(1);
            }
            isMutilTask = false;
        } 
TBSchedule源码学习笔记-线程组任务调度 根据上文的启动过程,找到了线程组的实现。com.taobao.pamirs.schedule.taskmanager.TBScheduleManager/** * 1、任务调度分配器的目标: 让所有的任务不重复,不遗漏的被快速处理。 * 2、一个Manager只管理一种任务类型的一组工作线程。 * 3、在一个JVM里面可能存在多个处理相同任务类型的Manager,也可能存在处理不同任务类 阅读详情

相关推荐

分布式开源调度框架TBSchedule原理与应用

第一部分 TBSchedule基本概念及原理 1. 概念介绍 2. 工作原理 3. 源码分析 4. 与其他开源调度框架对比 第二部分 TBSchedule分布式调度示例 1. TBSchedule源码下载 2. 引入源码Demo开发示例 3. 控制台配置任务调度 4. selectTasks方法参数说明 5. 创建调度策略参数说明 6. 创建任务参数说明第一部分 TBSchedule基本概念

传说今天不多说 4万+

TBSchedule淘宝开源定时任务调度框架(附客户端源码demo)

淘宝开源定时任务调度框架 下载TBSchedule源码svn地址:code.taobao.org/p/tbschedule/src/trunk/ 内容包括两部分:TBSchedule源码及开发依赖包tbschedule、调度控制台ScheduleConsole.war(配置监控查看运行状况)   TBSchedule介绍: 1)调度机的高可用有保障,多调度机向注册中心注册后,共享调度任务

mingtianmeihao的专栏 5078

tbschedule源码学习

tbschedule源码学习tbschedule使用zk来解决集群间的同步问题,首先看一下zk上面的结构信息 factory 是对应着每一个连接的机器,使用唯一的uuid做区分,后缀是zk自己维护的序列号 strategy是任务执行策略相关的设置,在每个task-n下面记录了这个任务的策略信息包括可以执行的机器,每个机器该任务执行最多几个线程组,一个线程组里多少个线程。tbschedule在执行的时

carey_OoO的博客 1118

tbschedule3.3.3源码详解

tbschedule是出自淘宝的一个分布式任务调度框架,经过了众多大型项目的考验。了解及使用可参考官方文档 http://code.taobao.org/p/tbschedule/wiki/index/ tbschedule的数据结构 tbschedule在zookeeper中的数据结构及与类的对应关系 下面从tbschedule的初始化流程入手,一步步分析tbs

A_zhenzhen的专栏 4040

TBSchedule调度平台疑难解答

前言:TBSchedule调度平台的环境搭建以及使用本文不在过多的介绍,如果不了可自行移步百度。本文主要介绍TBSchecduler集群、容灾、负载均衡怎么实现。本文仅供个人学习参考,未经作者允许请勿传递。 TBSchedule调度管理控制台 下图是TBSchedule调度管理控制台,该页面是作者稍微修改UI后的结果;原生的页面确实太简陋了,看着不舒服。后文主要对调度策略、任务管理、机器管理进行深入介绍,建议各位朋友先下载源码把环境先搭建起来,能够调起任务。 机器管理 学过微服务的同学都知道,一.

a_teacher_java的博客 1645

Spring Task+Zookeeper分布式定时任务调度组件-Taroco-Scheduler.zip

Spring Task+Zookeeper分布式定时任务调度组件-Taroco-Scheduler

算法笔记 经典取石子游戏总结 博弈论

经典取石子游戏总结 1.巴什博弈 有一堆石子共n个,A和B轮流取,A先取。每次最少取1个,最多取m个,先取完者获胜(即没有石子取的人失败)。A与B都足够聪明,问A能否获胜。 结论:当n%(m+1)!=0时A必胜,否则必败。 2.斐波那契博弈 有一堆石子共n个,A和B轮流取,A先取。每次最少取1个。第一次不能取完。从第二次开始,每个人取的石子数至少为1,至多为前一个人取的石子数的2倍。先取完者获胜。...

CraigMC的博客 2936

告别OFDM卡顿:用MATLAB手把手仿真AFDM波形,搞定高铁、无人机通信的时变信道难题

本文详细介绍了如何使用MATLAB仿真AFDM波形,解决高铁和无人机通信中的时变信道难题。通过仿射变换技术,AFDM在多普勒频移严重的场景下表现优异,显著提升通信质量。文章包含参数配置、波形生成、性能对比等实战内容,适合通信工程师和研究人员参考。

weixin_27014595的博客 318

ECharts 实现世界地图

效果图 源代码(仅供参考) <template> <div class="echarts"> <div class="className" id="id" style="width: 100%; height: 450px" ref="myEchart" ></div> </div> </template> <script lang="ts"> imp

EsquireY的博客 4874

CNN卷积神经网络手写数字识别实例及代码详解

本文的代码来自githup的Deep Learning的toolbox,是用Matlab实现的。感谢该toolbox的作者付出和分享。 我在应该该代码进行训练时,出现一些报错,如expand函数应用不对,flipall函数未定义等问题,对这些问题进行了修正,完成网络训练和验证。 本文mnist_uint8.mat的获取可以参照我的另一篇博客:MNIST数据库处理--matlab生成mnist_

VivienFu的专栏 6万+

AURIX™ TC3xx 调试口保护 secure debug

AURIX™ TC3xx 调试口保护 secure debug UCB_DBG_ORIG and UCB_DBG_COPY Content 使用Debug Password 保护调试接口设置 项目硬件接口保护方案 hexview Lock using UDE Unlockusing UDE Lock using Lauterbach Unlock using Lauterbach

2301_76563067的博客 6857

ffmpeg(一) ffmpeg+QT开发环境搭建

(exe 程序编译的时候只需要包含 xxx.dll.a 静态导入库,运行的时候才需要 xxx.dll 文件)这个 .pro 文件的配置,是指导程序编译的时候,可以找到对应的动态库。值得一提的是,在Windows中,静态链接库(Static Link Library)的扩展名也是.lib、.dll.a。其实只要你掌握了FFmpeg,也可以很快上手其他音视频开发库,因为底层原理都是一样的,你最终操作的都是一样的数据,比如MP3、MP4文件。导入库:不包含函数的具体实现代码(函数的具体实现代码存储在dll中)

小道士写程序 8204

深入剖析RDMA Netlink:Linux内核中高效通信的基石

RDMA Netlink:Linux内核中高效通信控制的核心机制 RDMA技术通过绕过内核实现高速数据传输,但其管理控制仍需内核参与。drivers/infiniband/core/netlink.c文件作为RDMA子系统的心脏,构建了用户空间与内核间的高效通信桥梁。该模块采用模块化客户端架构,通过全局数组管理不同类型的RDMA功能,如设备管理、连接服务和链路层操作。从最初的全局锁到细粒度读写锁的演进,展现了Linux内核追求高性能的持续优化。同时,通过条件编译支持新旧内核版本和网络命名空间,体现了稳定性与

数字人生 238

第一百三十九回 介绍三个BLE包

本章回中主要介绍了Flutter中BLE的概念和操作方法,主要介绍了三个BLE包的功能和差异,以方便大家在BLE操作中选择不同的包。

talk_8的专栏 574

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

上一篇: TBSchedule源码学习笔记-线程组任务调度
下一篇: dubbo源码分析(二):超时原理以及应用场景
weiythi
博客等级 码龄16年 23粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值