精华内容
下载资源
问答
  • tbSchedule

    2018-07-16 17:54:35
    ...摘要:说明:tbschedule项目其实可以分为两部分:1)schedule管理控制台(调度机)。负责控制、监控任务执行状态2)实际执行job的客户端程序(执行机)。在实际使用时,首先要启动zookeeper,然后部署...

    http://code.taobao.org/p/tbschedule/wiki/index/

    http://mycolababy.iteye.com/blog/2288465

    • 摘要:说明:tbschedule项目其实可以分为两部分:1)schedule管理控制台(调度机)。负责控制、监控任务执行状态2)实际执行job的客户端程序(执行机)。在实际使用时,首先要启动zookeeper,然后部署tbscheduleweb界面的管理控制台,最后启动实际执行job的客户机器。这里zookeeper并不实际控制任务调度,它只是负责与N台执行job的客户端通讯,协调、管理、监控这些机器的运行信息。实际分配任务的是tbschedule管理控制台,控制台从zookeeper获取job的运行信息。tbSchedule通过控制ZNode的创建、修改、删除来间接控制Job的执行,执行Job的ZOOKEEPER客户端会监听它们对应ZNode的状态更新事件,从而达到通过tbSchedule控制Job执行的目的。当通信断开后或,节点会自动摘除。新增执行机时会创建新的节点。tbschedule会定时扫描当前服务器的数量,重新分配任务。问题是tbschedule怎么处理执行到一半的任务???

    tbschedule提供了两个核心组件ScheduleServer、TbscheduleManagerFactory和两类核心接口IScheduleTaskDeal(不能被直接使用,被后面两个类继承)、IScheduleTaskDealSingle(比如公司的静态数据处理系统)、IScheduleTaskDealMuti(比如公司的交易系统),这两部分是客户端研发的关键部分,是使用tbschedule必须要了解的。

     

    使用:

    1.jar依赖

    <dependency>
                <groupId>com.taobao.pamirs.schedule</groupId>
                <artifactId>tbschedule</artifactId>
                <version>3.3.3.2</version>
    </dependency>

    2.实现类必须实现的方法:getComparator(),selectTasks(),execute()

    3.对数据分片(不是真正意义上数据库分片会将数据存到别的库):例

    and MOD(id, #{taskItemNum}) in (${taskCondition})
    order by id  limit #{fetchNum}

    4.selectTasks方法获取需要处理的列表(用集合装着),循环集合中的元素并调用execute方法执行。子计时任务启动,会直到获取不到数据后才停止等待下一个子计时开始

    5.任务项的说明:
    1、将一个数据表中所有数据的ID按10取模,就将数据划分成了0、1、2、3、4、5、6、7、8、9供10个任务项。
    2、将一个目录下的所有文件按文件名称的首字母(不区分大小写), 就划分成了A、B、C、D、E、F、G、H、I、J、K、L、M、N、O、P、Q、R、S、T、U、V、W、X、Y、Z供26个任务项。
    3、将一个数据表的数据ID哈希后按1000取模作为最后的HASHCODE,我们就可以将数据按[0,100)、[100,200) 、[200,300)、[300,400) 、[400,500)、[500,600)、[600,700)、[700,800)、[800,900)、 [900,1000)划分为十个任务项, 当然你也可以划分为100个任务项,最多是1000个项。
    4、任务项是进行任务分配的最小单位。一个任务队列只能由一个ScheduleServer来进行处理。但一个Server可以处理任意数量的任务项。

     

    展开全文
  • tbschedule

    2018-06-01 17:40:18
    http://code.taobao.org/p/tbschedule/wiki/index/
    展开全文
  • TBSchedule

    2015-07-14 18:47:45
    本文记录一下TBSchedule使用过程中的一些疑问 NOTSleep类型的任务会不停的调度,不管cron时间怎么设置的。 Sleep类型的任务,如果在一个调度周期内还没有执行完select出来的所有任务后,下一个启动周期...

    本文记录一下TBSchedule使用过程中的一些疑问


    NOTSleep类型的任务会不停的调度,不管cron时间怎么设置的。


    Sleep类型的任务,如果在一个调度周期内还没有执行完select出来的所有任务后,下一个启动周期启动新的任务筛选

    展开全文
  • tbschedule使用

    2020-04-02 00:01:16
    文章目录tbschedule使用一、简介二、tbschedule知识点2.1 tbschedule特点2.2 tbschedule实现三、tbschedule关键类3.1 ZKManager3.2 TBScheduleManagerFactory3.2.1 配置zookeeper3.2.2 调度任务和调度策略的管理器...

    tbschedule使用

    一、简介

    tbschedule是淘宝开源的,能够让批量任务或变化的任务,被动态的分配到不同主机(可分布式)的jvm,不同的线程组中并行执行。所有任务能够不重复,不遗漏的执行。

    二、tbschedule知识点

    2.1 tbschedule特点

    tbschedule特点如下:

    • 能够让批量任务或变化的任务,被动态的分配到不同主机(可分布式)的jvm,不同的线程组中并行执行。
    • 所有任务能够不重复,不遗漏的执行。

    2.2 tbschedule实现

    • tbschedule的任务、策略等调度数据是存储在zookeeper中的。
    • tbschedule的执行是基于jdk的Timer和TimerTask实现的。
    • tbschedule中的任务,是依附于策略而运行的。也就是说,任务定义了要执行的行为,包括任务名称、取数据和数据处理的bean、每次取数的数量、执行的开始与结束时间、任务项等信息,而策略定义了要执行的任务、在哪台机器上执行、所有机器最大线程组,单个机器线程组数等,并控制任务的执行与停止。

    三、tbschedule关键类

    3.1 ZKManager

    ZKManager就是最基本的zookeeper会话管理类,内容包括zookeeper的创建、会话的连接或重连接、关闭会话等。

    3.2 TBScheduleManagerFactory

    TBScheduleManagerFactory是tbschedule管理类,包含的功能有:

    3.2.1 配置zookeeper

    配置zookeeper,并创建zookeeper会话,zookeeper的配置信息有:zkConnectString, rootPath, userName, password, zkSessionTimeout, isCheckParentPath

    3.2.2 调度任务和调度策略的管理器生成
    • ScheduleDataManager4ZK,调度任务管理器(对应在zookeeper中的数据),在此进行初始化和生成。
    • ScheduleStrategyDataManager4ZK,调度策略管理器(对应在zookeeper中的数据),在此进行初始化和生成。
    3.2.3 调度服务的重启、停止等

    如stopServer(String strategyName)、stopAll()、reStart()等。

    3.3 ScheduleServer

    任务处理器(可以理解为线程组),由一组线程(n个线程)组成,每个任务处理器有全局唯一的标识符,一般以IP$UUID[例如192.168.1.100$0C78F0C0FA084E54B6665F4D00FA73DC]的形式出现,一个任务类型的数据可以n个任务处理器处理。内分为Sleep模式和NotSleep模式:

    3.3.1 sleep模式

    sleep模式,当一线程处理完任务,同时从任务池取不到任务时,若其它线程仍工作,则自己休眠,若其它线程已休眠,则新调取需要处理的数据,同时唤醒其它休眠线程处理数据;

    3.3.2 NotSleep模式

    NotSleep模式,当一线程处理完任务,同时从任务池取不到任务时,则新调取需要处理的数据,同时唤醒其它休眠线程处理数据;

    3.4 TaskItem

    任务项,也就是将待处理的任务(数据),进行分片划分,

    如:可以按数据的id按10取模,这样就将数年数据划分成了0、1、2、3、4、5、6、7、8、9共10个任务项;

    也可按数据的首字母分成了A、B、C、D、E、F、G、H、I、J、K、L、M、N、O、P、Q、R、S、T、U、V、W、X、Y、Z供26个任务项。

    这个可以根据需要自行定义的。

    3.5 TaskDealBean

    自定义的任务处理类,需要实现Schedule的接口IScheduleTaskDealMulti(批处理)或者IScheduleTaskDealSingle(单任务处理),内部主要有两个方法,一个是筛选需当前任务处理器处理的数据,另一个是处理已筛选好的数据。

    3.6 OwnSign

    环境,指定运行环境,如:开发环境、测试环境、预发环境、生产环境。在筛选当前任务处理器需处理的数据时,会传入该参数。

    3.7 ScheduleTaskType

    任务的配置类,包括运行的线程数(threadNumber)、运行时间,任务项分组、没数据时的休眠时间、每次取数的量等

    3.8 ScheduleStrategy

    策略的配置类,所有机器的最大线程组数(assignNum),单个jvm的线程数(numOfSingleServer),运行机器(IPList)等信息。

    四、tbschedule使用

    这里以tbschedule与spring结合为例,介绍使用的开发步骤。其中尽可能多的理解tbschedule和spring后,能理解tbschedule与spring整合的方式其实有多种形式的,在此介绍一种方式 ,任务和策略在spring启动时进行自动注册。

    4.1 添加maven依赖

    另一种方式是直接下载源码,这种方式更好,因为目前版本的tbschedule是有bug的,如查看zookeeper连接信息时,tbschedule源码是新建已在代码写死的属性,或者读取tomcat中未有的tbschedule配置类,这是不对,应直接读取已有的zookeeper属性,当然直接maven依赖也不影响使用),spring依赖包在此略过。

    <dependency>
      <groupId>com.taobao.pamirs.schedule</groupId>
      <artifactId>tbschedule</artifactId>
      <version>3.2.18</version>
    </dependency>
    <dependency>
      <groupId>org.apache.zookeeper</groupId>
      <artifactId>zookeeper</artifactId>
      <version>3.4.6</version>
    </dependency>
    

    4.2 下载tbschedule源码

    下载地址:http://code.taobao.org/p/tbschedule,
    将路径下的tbschedule/branches /3.1.0/src/WebRoot/schedule文件夹复制到工程webapp下,里面tbschdule的jsp文件,便于页面查看与控制任务执行。

    4.3 编写自定义抽象任务类

    编写自定义抽象任务类,内包含调度任务配置类scheduleTaskType和调度策略配置类scheduleStrategy,便于过会对任务进行自动注册任务和策略信息,该类同时可实现接口IScheduleTaskDealSingle,继承该抽象类的任务类实现其中的方法,如AbstractBaseScheduleTask.java:

    public abstract class AbstractBaseScheduleTask<T> implements IScheduleTaskDealSingle<T> {
        /**
         * 调度任务的配置
         */
        private ScheduleTaskType scheduleTaskType;
        /**
         * 调度策略的配置
         */
        private ScheduleStrategy scheduleStrategy;
    
        public ScheduleTaskType getScheduleTaskType() {
            return scheduleTaskType;
        }
    
        public void setScheduleTaskType(ScheduleTaskType scheduleTaskType) {
            this.scheduleTaskType = scheduleTaskType;
        }
    
        public ScheduleStrategy getScheduleStrategy() {
            return scheduleStrategy;
        }
    
        public void setScheduleStrategy(ScheduleStrategy scheduleStrategy) {
            this.scheduleStrategy = scheduleStrategy;
        }
    }
    

    4.4 编写启动类

    编写启动类,继承TBScheduleManagerFactory类,用于配置zookeeper信息,实现ApplicationListener接口,并实现其内部方法,用于在spring容器启动后,加载调度任务和调度策略的配置信息到zookeeper中,如类SystemTBScheduleManagerFactory.java :

    public class SystemTBScheduleManagerFactory extends TBScheduleManagerFactory implements ApplicationListener<ContextRefreshedEvent>{
    
        @Override
        public void onApplicationEvent(ContextRefreshedEvent event) {  //注册调度任务和调度策略
            try {
                super.init(); //默认初始化信息
    
                IScheduleDataManager iScheduleDataManager = null;
                ScheduleStrategyDataManager4ZK scheduleStrategyDataManager4ZK = null;
                int waitSecond = 120; //默认初始化等待时间,最长120秒
                while((null == iScheduleDataManager || null == scheduleStrategyDataManager4ZK) && waitSecond>0){
                    waitSecond--;
                    TimeUnit.SECONDS.sleep(1); //等待1秒
                    try{
                        iScheduleDataManager = super.getScheduleDataManager();//获取调度任务管理器
                        scheduleStrategyDataManager4ZK = super.getScheduleStrategyManager();//获取调度策略管理器
                    }catch (Exception e){
                    }
                }
                Assert.notNull(iScheduleDataManager,"初始化tbschedule配置信息失败"); //若仍初始化失败,则抛异常
                Assert.notNull(scheduleStrategyDataManager4ZK,"初始化tbschedule配置信息失败"); //若仍初始化失败,则抛异常
    
                Map<String,AbstractBaseScheduleTask> taskMap = event.getApplicationContext().getBeansOfType(AbstractBaseScheduleTask.class);
                for(Map.Entry<String,AbstractBaseScheduleTask> m : taskMap.entrySet()){
                    String key = m.getKey();
                    AbstractBaseScheduleTask task = m.getValue();
    
                    ScheduleTaskType taskType = task.getScheduleTaskType();
                    taskType.setBaseTaskType("task_"+key); //任务类型(任务名称)
                    taskType.setDealBeanName(key);
    
                    ScheduleStrategy scheduleStrategy = task.getScheduleStrategy();
                    scheduleStrategy.setStrategyName("strategy_"+key); //策略名称
                    scheduleStrategy.setTaskName(taskType.getBaseTaskType()); //任务名称
                    scheduleStrategy.setKind(ScheduleStrategy.Kind.Schedule);
    
                    iScheduleDataManager.updateBaseTaskType(taskType);
                    scheduleStrategyDataManager4ZK.updateScheduleStrategy(scheduleStrategy);
                }
    
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    

    4.5 编写任务类

    编写任务类,继承前面自定义的抽象类AbstractBaseScheduleTask.java,如:

    public class SimpleTask extends AbstractBaseScheduleTask<Date> {
    
        /**
         * 执行单个任务
         * @param task Object
         * @param ownSign 当前环境名称
         * @throws Exception
         */
        public boolean execute(Date task, String ownSign) throws Exception{
            System.out.println("dispose task : "+task.getTime());  //当前任务处理器内的线程处理数据
            return true;
        }
    
        /**
         * 根据条件,查询当前调度服务器可处理的任务
         * @param taskParameter 任务的自定义参数
         * @param ownSign 当前环境名称
         * @param taskItemNum 当前任务类型的任务队列数量
         * @param taskItemList 当前调度服务器,分配到的可处理队列
         * @param eachFetchDataNum 每次获取数据的数量
         * @return
         * @throws Exception
         */
        public List<Date> selectTasks(String taskParameter, String ownSign, int taskItemNum, List<TaskItemDefine> taskItemList, int eachFetchDataNum) throws Exception {
            List<Date> dateList = new ArrayList<>();
    
            List<Long> taskIdList = new ArrayList<>();
            for(TaskItemDefine t : taskItemList){ //确定当前任务处理器需处理的任务项id
                taskIdList.add(Long.valueOf(t.getTaskItemId()));
            }
    
            for(int i=0;i<eachFetchDataNum;i++){ // 添加最多指定数量的待处理数据
                Date date = new Date(); //生成待处理数据
                Long remainder = date.getTime() % taskItemNum ;
                if(taskIdList.contains(remainder)){  //根据数据取模,判断当前待处理数据,是否应由当前任务处理器处理
                    dateList.add(date);
                }
                TimeUnit.SECONDS.sleep(1);
            }
            return dateList;  //返回当前任务处理器需要处理的数据
        }
    
        /**
         * 获取任务的比较器,主要在NotSleep模式下需要用到
         * @return
         */
        public Comparator<Date> getComparator() {
            return null;
        }
    }
    

    6、配置spring文件spring-tbschedule.xml

    配置spring文件spring-tbschedule.xml,包含启动类和任务类配置。

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context.xsd
    ">
    
        <!--tbschedule管理器初始化(配置zookeeper,注册调度任务和调度策略)-->
        <bean id="systemTBScheduleManagerFactory" class="com.dragon.tbscheduleStudy.system.SystemTBScheduleManagerFactory">
            <property name="zkConfig">
                <map>
                    <entry key="zkConnectString" value="127.0.0.1:2181" />
                    <entry key="rootPath" value="/myself/tbscheduleStudy" />
                    <entry key="userName" value="root" />
                    <entry key="password" value="123456" />
                    <entry key="zkSessionTimeout" value="8000" />
                    <entry key="isCheckParentPath" value="true" />
                </map>
            </property>
        </bean>
    
        <!--任务simpleTask-->
        <bean id="simpleTask" class="com.dragon.tbscheduleStudy.task.SimpleTask" >
            <property name="scheduleTaskType">
                <bean class="com.taobao.pamirs.schedule.taskmanager.ScheduleTaskType">
                    <!--允许执行的开始时间-->
                    <property name="permitRunStartTime" value="0 0 0 * * ?" />
                    <!--允许执行的结束时间-->
                    <property name="permitRunEndTime" value="59 59 23 * * ?"  />
                    <!--当没有数据的时候,休眠的时间-->
                    <property name="sleepTimeNoData" value="3000"  />
                    <!--在每次数据处理晚后休眠的时间-->
                    <property name="sleepTimeInterval" value="1000"  />
                    <!--每次获取数据的数量-->
                    <property name="fetchDataNumber" value="10"  />
                    <!--任务项数组-->
                    <property name="taskItems">
                        <list>
                            <value>0:{TYPE=A,KIND=1}</value>
                            <value>1:{TYPE=B,KIND=2}</value>
                            <value>2:{TYPE=C,KIND=3}</value>
                        </list>
                    </property>
                </bean>
            </property>
            <property name="scheduleStrategy">
                <bean class="com.taobao.pamirs.schedule.strategy.ScheduleStrategy">
                    <!--最大线程组数量-->
                    <property name="assignNum" value="9" />
                    <!--单个机器的线程组数量-->
                    <property name="numOfSingleServer" value="3" />
                    <!--策略运行的机器-->
                    <property name="IPList">
                        <list>
                            <value>127.0.0.1</value>
                        </list>
                    </property>
                </bean>
            </property>
        </bean>
    </beans>
    

    4.7 配置web.xml文件

    配置web.xml文件,如:

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://java.sun.com/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
            http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
             version="3.0">
      <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring-tbschedule.xml</param-value>
      </context-param>
    
      <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
      </listener>
    </web-app>
    

    4.8 修改项目index.jsp页面

    修改项目的index.jsp页面,重定向到tbschedule首页,如:

    <%
        response.sendRedirect("schedule/index.jsp");
    %>
    

    至此,开发流程结束,

    启动项目,在浏览器输入http://localhost:8080/schedule/index.jsp,可查看任务情况,

    若想修改配置,则输入地址http://localhost:8080/schedule/index.jsp?manager=true即可

    展开全文
  • TBSchedule资料

    2018-04-04 14:47:49
    TBSchedule资料
  • TBschedule入门

    千次阅读 2015-04-15 15:39:37
    tbschedule 淘宝的wiki: http://code.taobao.org/p/tbschedule/wiki/index/ 截取内容如下: 此文档内部包括: 1、设计目标说明 2、主要概念解释 3、涉及的数据对象说明 4、涉及的业务接口说明 ...
  • tbSchedule 使用

    2019-04-22 11:11:18
    TBSchedule是一个支持分布式的调度框架,让批量任务或者不断变化的任务能够被动态的分配到多个主机的JVM中,在不同的线程组中并行执行,所有的任务能够被不重复,不遗漏的快速处理。基于ZooKeeper的纯Java实现,由...
  • 淘宝分布式调度框架TBSchedule是淘宝的一块开源软件,TBSchedule有很多特性,包括批量任务,多主机,多线程,动态扩展,实时或定时任务,分片,并发,不重复执行。TBSchedule依赖于ZK存储调度数据,在使用中充当着...
  • tbschedule介绍

    千次阅读 2015-05-23 16:24:00
    如果一台服务器不能满足... tbschedule是一种能够让一种批量任务或者不断变化的任务,能够被动态的分配到多个主机的JVM中,不同的线程组中并行执行,所有的任务能够被不重复,不遗漏的快速处理的框架。 二、tbschedul
  • tbschedule-ScheduleConsole美化版
  • 大家好,在讲tbschedule使用之前,我们先了解下tbschedule的调度原理,不然大家对tbschedule的配置会不太理解 任务分片,调度器/线程组!我们前面对这些名词做一个大概的解释! 今天针对这些名词我们来深入的讲解下...
  • TBSchedule HelloWorld

    2017-05-02 11:10:07
    淘宝官方参考手册:...1.TBSchedule项目其实可以分为两部分: ①TBSchedule管理控制台。负责监控,监控任务执行状态 ②实际执行job的客户端程序 在实际使用时,首先要启动zookeeper,然后部署T...
  • zookeeper+TOMCAT+TBSchedule集合 详见https://blog.csdn.net/songbob/article/details/84837851
  • 今天开始我们的实战配置的章节。代码我共享在qq群里了!751124494。 业务场景介绍 先把我们的业务场景介绍下,这里有两张表user_detail 是源数据表user_...下面介绍下test-tbschedule的代码, test-tbschedule 这...
  • 原文地址:http://geek.csdn.net/news/detail/65738【编者按】 TBSchedule是一款非常优秀的高性能分布式调度框架,本文...另外,作者写这篇文章的目的一是出于对TBSchedule的一种热爱,二是现在是一个资源共享、技术共
  • tbschedule源码学习

    2016-12-24 21:04:50
    tbschedule源码学习tbschedule使用zk来解决集群间的同步问题,首先看一下zk上面的结构信息 factory 是对应着每一个连接的机器,使用唯一的uuid做区分,后缀是zk自己维护的序列号 strategy是任务执行策略相关的设置,...
  • TbSchedule中定时规则生成quartzcron.zip
  • tbschedule3.3.3源码详解

    千次阅读 2017-09-06 09:56:31
    tbschedule是出自淘宝的一个分布式任务调度框架,经过了众多大型项目的考验。了解及使用可参考官方文档 http://code.taobao.org/p/tbschedule/wiki/index/ tbschedule的数据结构 tbschedule在zookeeper中的...
  • TbSchedule应用解读

    2017-11-22 20:39:00
    TbSchedule使用过程中几个参数非常容易混淆,根据测试对一下重要参数进行解读: 例如任务项:0,1,2,3,4,5,6,7,8,9; 调度策略中最大线程组数量:5; 每次获取的数量:500; 任务的线程数:10; 任务根据执行开始...
  • 分布式任务系统:比较有名的是 Quartz集群版(Spring 带的),tbschedule(阿里开源),elastic-job(当当开源)。 tbschedule 地址:http://code.taobao.org/p/tbschedule/wiki/index/
  • tbschedule-3.3.3.2.jar

    2018-05-24 09:12:31
    TBSchedule是一个支持分布式的调度框架,能让一种批量任务或者不断变化的任务,被动态的分配到多个主机的JVM中,不同的线程组中并行执行。基于ZooKeeper的纯Java实现,由Alibaba开源。

空空如也

空空如也

1 2 3 4 5 ... 18
收藏数 358
精华内容 143
热门标签
关键字:

TBSchedule