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

别自己写CDC了!聊聊Xilinx AXI4-Stream Clock Converter IP里的寄存器管道模式到底有多省资源

本文探讨了Xilinx AXI4-Stream Clock Converter IP核的寄存器管道模式在FPGA设计中的高效资源利用。通过对比手工CDC实现,详细解析了IP核的精简化同步架构和时序收敛优势,并提供了实战案例和优化策略,帮助工程师快速实现时钟域转换,显著提升设计效率和性能。

weixin_33738555的博客 441

RK3568平台 麦克风PDM接口录音_rk pdm配置

在RK平台,Android的Audio HAL层中一般会都会有导出录音播放数据的功能。如播放的,是会直接送到声卡中的,对于播放出现问题的情况,可以从分析导出的音频数据是否正常,可以基本知道,是在应用、解码出现的问题,还是送到声卡过程中出现问题。当点开app进行录音的时候会调用到static int start_input_stream(struct stream_in *in)。音频在PDM接口输入,不经过编解码芯片直接到RK主芯片,RK主芯片自带PCM编解码功能。以下软件能播放保存下来的pdm文件。

2401_83817122的博客 2343

【信创-k8s】银河麒麟V10国防版+鲲鹏/飞腾(arm64架构)在线/离线部署k8s1.30+kubesphere

银河麒麟作为国家核高基专项的重要成果,国防版凭借其卓越的安全性和可靠性,已成为军工领域的首选操作系统。之前我们在适配麒麟V4国防版的过程中已发现诸多安全性要求,而麒麟V10国防版在安全防护等级上又达到了更高的级别。本文将主要演示离线部署,因为军工项目基本不会出现联网场景。即使在线,也可以按离线方式部署,且离线部署由于有私有仓库,不会存在镜像获取不到和丢失情况。

jiaworld的博客 730

《R 语言卡方检验全解析:手写代码实现与详细步骤》卡方检验

卡方检验(Chi-Square Test)是一种常用的统计方法,主要用于检验分类变量之间的独立性或拟合优度。在医学、社会科学等领域中,卡方检验常用于分析两个或多个分类变量之间的关系。以下是卡方检验的全面解析,包括实现代码和手写公式。χ2∑Ei​Oi​−Ei​2​Oi​Ei​dfr−1c−1rcdfk−1k如果卡方统计量大于临界值,或 p 值小于显著性水平(如 0.05),则拒绝原假设。

Mrrunsen的博客 685

对称式目镜设计实例

对称式目镜设计实例

weixin_72050316的博客 1163

基于STFT和卷积神经网络的时序数据分类

我们提供了相应的代码和数据,读者可以直接运行并尝试在自己的数据集上进行分类实验。在本文中,我们将介绍一种基于短时傅里叶变换(STFT)和卷积神经网络(CNN)的时序数据分类方法。我们将提供可直接运行的代码和数据,以帮助读者理解和实现这一方法。STFT可以提取信号的频谱信息,有助于捕捉时序数据中的关键特征。在这个例子中,我们将使用一个简化的手势识别数据集作为示例。在这段代码中,我们使用Adam优化器和稀疏分类交叉熵损失函数进行模型的编译。然后,我们使用训练集进行模型的训练,同时使用测试集进行模型性能的验证。

CodeWOW的博客 694

NVIDIA Jetson之远程控制软件NoMachine安装使用

参考:https://www.bilibili.com/video/BV1cg4y1i776?t=12 0 背景

ZONGXP的博客 1万+

动态视频目标追踪系统:基于YOLOv11+DeepSORT的从入门到实战全流程指南

仅保留车辆类别(假设车辆类别ID为2)if det.class_index == 2: # 车辆类别ID通过本指南,你已完成从环境搭建数据准备模型训练到追踪系统与UI界面的全流程,搭建了一套完整的动态视频目标追踪系统。该系统在安防监控、交通管理等场景中具有实用价值,可实现目标的实时稳定追踪。未来,你可尝试结合多模态特征(如目标外观+运动特征)提升追踪鲁棒性,或探索轻量化模型部署(如TensorRT加速),让系统在边缘设备上也能高效运行。

LXY_LOVE36的博客 142

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值