精华内容
下载资源
问答
  • 开源调度工具

    2018-12-02 20:43:53
    java开源调度工具 azkanban github地址:https://github.com/azkaban/azkaban
  • 开源调度系统

    千次阅读 2017-11-26 13:08:58
    开源调度系统开源调度系统,觉得不错的几个是 -opencron Azkaban、airflow、 参考这个:http://www.iteye.com/news/32353

    开源调度系统

    开源调度系统,觉得不错的几个是
    -opencron
    Azkaban、airflow、
    参考这个:http://www.iteye.com/news/32353

    展开全文
  • 开源调度器工具 Opswise 的 Java API 接口用法: 创建触发器: OpswiseAPIManager opswise = new OpswiseAPIManager("/home/user/dev_root/Jobswise/OpswiseAPI/config","na_opswise.json"); TriggerHandler ...
  • 开源调度平台XXL-JOB集成dubbo关于XXL-JOB为什么要集成dubbo集成步骤使用方法项目地址 关于XXL-JOB XXL-JOB是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。 项目github地址 ...

    关于XXL-JOB

    XXL-JOB是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。

    项目github地址

    平台通过部署调度中心,使用java调度框架Quartz远程调用执行器项目来完成调度任务。调度中心只用来执行调度任务,记录调度日志,具体任务通过执行器项目被调用执行。

    原生平台不支持调用dubbo,原因作者已经在github上的Issues上回答了。为了尽量保持轻量,减少对zk的依赖。

    为什么要集成dubbo

    我们公司现在的rpc框架使用的是dubbo,对于这些我们来说,我们需要借用XXL-JOB的调度中心的来调用服务。这些服务已经通过dubbo对外提供了,为了能让调度中心使用而在对应的服务工程下添加执行器并不是我们想要的,调度中心直接调用dubbo服务才是最合理的解决方案。

    集成步骤

    集成dubbo考虑使用dubbo的泛化调用来实现,好处是不用事先将dubbo的消费服务配置到调度中心的配置文件中,而是通过增加XXL-JOB的任务属性,通过任务数据来描述dubbo服务。

    增加任务不需要额外的开发和部署工作,而只是在调度中心里维护任务数据而已。

    1. 先对任务设置做一些小改动
      在这里插入图片描述
      新增DubboMethod和DubboVersion两个描述,数据库任务表也需对应增加。

    2. 增加zk配置
      调用dubbo服务需要有zk地址信息,这个没什么好说的。

    3. 创建新的IJobHandler,实现dubbo的泛化调用

    // reference需要在handle的构造函数中初始化
    // 用com.alibaba.dubbo.rpc.service.GenericService可以替代所有接口引用
    GenericService genericService = 
    					ReferenceConfigCache.getCache().get(reference);
    if (genericService == null) {
    			ReferenceConfigCache.getCache().destroy(reference);
    			XxlJobLogger.log("dubbo server " + reference.getInterface() + "." + this.serviceMethod + " is not founded!");
    			return new ReturnT<String>(IJobHandler.FAIL.getCode(), "dubbo server " +  this.serviceMethod + " is not founded!" );
    	}
    
    try {
    		Object obj = genericService.$invoke(this.serviceMethod, types, values);
    		ReturnT<String> result = new ReturnT<String>(200,"success");
    		result.setContent(obj == null ? "":JSONObject.toJSONString(obj));
    		return result;
    	} catch (Exception e) {
    		ReturnT<String> result = new ReturnT<String>(500,"fail");
    		result.setContent(JSONObject.toJSONString(e));
    		return result;
    	}
    
    
    1. 在加载任务时候,调用dubbo服务要与其他的调用方式区分开来。
    2. 调整日志
      原生日志太疯狂了,10几个任务1天就能塞满40G。而且根据调用线程将日志分散打印,1天能生成上万个文件夹。

    使用方法

    使用前提是已经存在可以调用的dubbo方法。

    以新增任务截图为例,依次说明。

    • 执行器 :这里写成dubbo,与原生的区分开来
    • 任务描述:略
    • 路由策略:由dubbo自己保证,这个选项没用
    • cron:略
    • 运行模式:dubbo
    • JobHandler:这里填写dubbo服务接口的全限定名
    • DubboMethod:dubbo服务的方法名
    • DubboVersion:dubbo服务的版本号
    • 阻塞处理策略:无用
    • 子任务:同原生
    • 任务超时时间:同原生
    • 失败重试次数:无用
    • 任务参数:输入特定格式字符串,前部分类型描述,后部分值描述。
      举例:test(String str,Integer i,Map c)
      对应参数:java.lang.String&java.lang.Integer&java.util.Map|hello world&111&{“code”:“ttp”}

    最后:

    项目地址

    展开全文
  • 分布式开源调度框架TBSchedule原理与应用

    万次阅读 多人点赞 2016-02-24 10:30:42
    4. 与其他开源调度框架对比 第二部分 TBSchedule分布式调度示例 1. TBSchedule源码下载 2. 引入源码Demo开发示例 3. 控制台配置任务调度 4. selectTasks方法参数说明 5. 创建调度策略参数说明 6. 创建任务参数说明...

    主要内容:

    第一部分 TBSchedule基本概念及原理
    1. 概念介绍
    2. 工作原理
    3. 源码分析
    4. 与其他开源调度框架对比

    第二部分 TBSchedule分布式调度示例
    1. TBSchedule源码下载
    2. 引入源码Demo开发示例
    3. 控制台配置任务调度
    4. selectTasks方法参数说明
    5. 创建调度策略参数说明
    6. 创建任务参数说明


    第一部分 TBSchedule基本概念及原理

    1. 概念介绍

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

    2. 工作原理

    TBSchesule对分布式的支持包括调度机的分布式和执行机的分布式,其网络部署架构图如下:

    这里写图片描述

    2.1 数据存储

    执行机和调度机均以ZooKeeper为注册中心,所有数据以节点及节点内容的形式注册,通过定时汇报主机状态保持存活在ZooKeeper上。

    首先看下执行机对ZooKeeper的使用配置文件:

    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
    <beans default-autowire="byName">
        <bean id="scheduleManagerFactory"
            class="com.taobao.pamirs.schedule.strategy.TBScheduleManagerFactory"
            init-method="init">
            <property name="zkConfig">
                <map>
                    <entry key="zkConnectString" value="${schedule.zookeeper.address}" />
                    <entry key="rootPath" value="${schedule.root.catalog}" />
                    <entry key="zkSessionTimeout" value="${schedule.timeout}" />
                    <entry key="userName" value="${schedule.username}" />
                    <entry key="password" value="${schedule.password}" />
                    <entry key="isCheckParentPath" value="true" />
                </map>
            </property>
        </bean>
    </beans>

    1)执行机部署启动,会在ZooKeeper上创建永久根节点schedule.zookeeper.address,其后所有的操作均在该根节点下进行。

    这里以/ttest/creditjob为根节点,查看执行机注册后情况:

    [zk: 172.26.50.86:2181(CONNECTED) 28] ls /ttest/creditjob
    [strategy, baseTaskType, factory]
    [zk: 172.26.50.86:2181(CONNECTED) 29] ls /ttest/creditjob/factory
    [127.0.0.1$MIE-ZHANGTAO-D1$9D3029EC0C574403B6CFD0C146644A77$0000000000, 127.0.0.1$MIE-ZHANGTAO-D1$D826BC6565DC4D6CB85F7AE321EE51AE$0000000001]

    可以看到根节点下面有3个永久子节点,strategy存储调度机创建的策略信息,baseTaskType存储调度机创建的任务信息,factory存储执行机注册的主机信息。每台执行机启动后,都会在factory下创建一个临时顺序子节点,该节点名是由TBSchedule源码生成的主机唯一表示。

    根节点内容为当前TBSchedule内置版本号,可在程序修改,实际没什么意义。

    [zk: 172.26.50.86:2181(CONNECTED) 17] get /ttest/creditjob
    tbschedule-3.2.12

    2)调度机部署启动,这时不会对ZooKeeper节点做任何操作。打开调度机配置面板:

    这里写图片描述

    配置好ZooKeeper接入点,点击管理主页,进入调度任务管理面板:

    这里写图片描述

    输入各项参数创建新任务后,此时会在baseTaskType下面创建任务名称永久子节点(调度机所有都宕机重启后,仍能保持数据的完整性),而当前节点的内容就是配置的各项参数。

    [zk: 172.26.50.86:2181(CONNECTED) 37] ls /ttest/creditjob/baseTaskType
    [IScheduleTaskDealSingleTest]
    
    [zk: 172.26.50.86:2181(CONNECTED) 39] get /ttest/creditjob/baseTaskType/IScheduleTaskDealSingleTest
    {"baseTaskType":"IScheduleTaskDealSingleTest","heartBeatRate":5000,"judgeDeadInterval":60000,"sleepTimeNoData":500,"sleepTimeInterval":0,"fetchDataNumber":500,"executeNumber":1,"threadNumber":1,"processorType":"SLEEP","permitRunStartTime":"0 * * * * ?","expireOwnSignInterval":1.0,"dealBeanName":"iScheduleTaskDealSingleTest","taskParameter":"0","taskKind":"static","taskItems":["0"],"maxTaskItemsOfOneThreadGroup":0,"version":0,"sts":"resume"}

    3)创建调度策略,控制调度机调度状态。

    这里写图片描述

    创建完成调度策略后开启调度,此过程会在对应的任务节点strategy下创建永久子节点并写入策略数据,在该子节点下创建表示调度机的临时顺序子节点并写入调度策略数据。

    [zk: 172.26.50.86:2181(CONNECTED) 56] get /ttest/creditjob/strategy/IScheduleTaskDealSingleTest
    {"strategyName":"IScheduleTaskDealSingleTest","IPList":["127.0.0.1"],"numOfSingleServer":0,"assignNum":1,"kind":"Schedule","taskName":"IScheduleTaskDealSingleTest","taskParameter":"0","sts":"resume"}
    
    [zk: 172.26.50.86:2181(CONNECTED) 57] get /ttest/creditjob/strategy/IScheduleTaskDealSingleTest/127.0.0.1$MIE-ZHANGTAO-D1$9D3029EC0C574403B6CFD0C146644A77$0000000000
    {"strategyName":"IScheduleTaskDealSingleTest","uuid":"127.0.0.1$MIE-ZHANGTAO-D1$9D3029EC0C574403B6CFD0C146644A77$0000000000","requestNum":1,"currentNum":0,"message":""}

    同时会在baseTaskType/IScheduleTaskDealSingleTest下创建下创建两层永久子节点并注册调度主机数据。

    [zk: 172.26.50.86:2181(CONNECTED) 45] ls /ttest/creditjob/baseTaskType/IScheduleTaskDealSingleTest/IScheduleTaskDealSingleTest
    [taskItem, server]
    
    [zk: 172.26.50.86:2181(CONNECTED) 50] get /ttest/creditjob/baseTaskType/IScheduleTaskDealSingleTest/IScheduleTaskDealSingleTest/taskItem
    IScheduleTaskDealSingleTest$127.0.0.1$4E8008EE18334564BE1E31C7C0D55296$0000000000,IScheduleTaskDealSingleTest$127.0.0.1$4E8008EE18334564BE1E31C7C0D55296$0000000001
    
    [zk: 172.26.50.86:2181(CONNECTED) 51] get /ttest/creditjob/baseTaskType/IScheduleTaskDealSingleTest/IScheduleTaskDealSingleTest/server  
    reload=true
    2.2 分布式高可用高效率保障

    1)调度机的高可用有保障,多调度机向注册中心注册后,共享调度任务,且同一调度任务仅由一台调度机执行调度,当前调度机异常宕机后,其余的调度机会接上。

    2)执行机的高可用有保障,多执行机向注册中心注册后,配置执行机单线程(多机总线程为1)执行任务,调度机会随机启动一台执行机执行,当前执行异常机宕机后,调度机会会新调度一台执行机。

    3)执行机的并行高效保障,配置执行机多线程且划分多任务子项后,各任务子项均衡分配到所有执行机,各执行机均执行,多线程数据一致性协调由任务项参数区分。

    4)弹性扩展失效转移保障,运行中的执行机宕机,或新增执行机,调度机将在下次任务执行前重新分配任务项,不影响正常执行机任务(崩溃的执行机当前任务处理失效);运行中的调度机宕机或动态新增调度机,不影响执行机当前任务,调度机宕机后动态切换。

    3. 源码分析
    3.1 执行机注册节选

    从Spring配置文件可以看到,执行机注册的入口在TBScheduleManagerFactoryinit方法,代码片段:

    public class TBScheduleManagerFactory implements ApplicationContextAware {
        public void init() throws Exception {
            Properties properties = new Properties();
            for(Map.Entry<String,String> e: this.zkConfig.entrySet()){
                properties.put(e.getKey(),e.getValue());
            }
            this.init(properties);
        }
    
        public void init(Properties p) throws Exception {
            if(this.initialThread != null){
                this.initialThread.stopThread();
            }
            this.lock.lock();
            try{
                this.scheduleDataManager = null;
                this.scheduleStrategyManager = null;
                ConsoleManager.setScheduleManagerFactory(this);
                if(this.zkManager != null){
                    this.zkManager.close();
                }
                this.zkManager = new ZKManager(p);
                this.errorMessage = "Zookeeper connecting ......" + this.zkManager.getConnectStr();
                initialThread = new InitialThread(this);
                initialThread.setName("TBScheduleManagerFactory-initialThread");
                initialThread.start();
            }finally{
                this.lock.unlock();
            }
        }
    }

    init方法将配置参数封装到Properties对象后开始初始化,连接上ZooKeeper并启动一个新的线程进行节点数据处理。

    this.zkManager = new ZKManager(p);
    ...
    initialThread = new InitialThread(this);
    initialThread.start();

    跟踪代码可以看到新线程调用的实际处理方法是:

    public void initialData() throws Exception{
    
        /** 递归创建永久根节点(/ttest/creditjob)并写入版本信息 */
        this.zkManager.initial();
    
        /** 创建永久子节点 baseTaskType */
        this.scheduleDataManager = new ScheduleDataManager4ZK(this.zkManager);
    
        /** 创建永久子节点 strategy 和 factory */
        this.scheduleStrategyManager  = new ScheduleStrategyDataManager4ZK(this.zkManager);
    
        if (this.start == true) {
    
            /** 注册调度管理器,创建临时顺序子节点,节点表示主机的注册信息 */
            this.scheduleStrategyManager.registerManagerFactory(this);
            if(timer == null){
                timer = new Timer("TBScheduleManagerFactory-Timer");
            }
    
            if(timerTask == null){
                /** 启动一个定时器检测ZooKeeper状态,如果连接失败,关闭所有的任务后,重新连接Zookeeper服务器 */
                timerTask = new ManagerFactoryTimerTask(this);
                timer.schedule(timerTask, 2000,this.timerInterval);
            }
        }
    }

    上述几个节点创建完成,并向ZooKeeper注册监听,当有数据变化时获得通知(任务执行/暂停)。到这里,就完成了执行机到ZooKeeper的注册监听过程。

    3.2 调度任务创建节选

    任务创建提交保存为入口,将参数封装到ScheduleTaskType对象中,调用节点创建和更新方法:

    //taskTypeEdit.jsp->taskTypeDeal.jsp
    
    if(action.equalsIgnoreCase("createTaskType")){
        ConsoleManager.getScheduleDataManager().createBaseTaskType(taskType);
        result = "任务" + baseTaskType + "创建成功!!!!";
    }else{
        ConsoleManager.getScheduleDataManager().updateBaseTaskType(taskType);
        result = "任务" + baseTaskType + "修改成功!!!!";          
    }

    真正执行任务节点及数据处理的代码段:

    //ScheduleDataManager4ZK.java
    
    public void createBaseTaskType(ScheduleTaskType baseTaskType) throws Exception {
        if(baseTaskType.getBaseTaskType().indexOf("$") > 0){
            throw new Exception("调度任务" + baseTaskType.getBaseTaskType() +"名称不能包括特殊字符 $");
        }
    
        /** 在 baseTaskType 节点下创建任务永久节点并写入节点内容为任务配置参数 */
        String zkPath = this.PATH_BaseTaskType + "/"+ baseTaskType.getBaseTaskType();
        String valueString = this.gson.toJson(baseTaskType);
        if ( this.getZooKeeper().exists(zkPath, false) == null) {
            this.getZooKeeper().create(zkPath, valueString.getBytes(), this.zkManager.getAcl(),CreateMode.PERSISTENT);
        } else {
        throw new Exception("调度任务" + baseTaskType.getBaseTaskType() + "已经存在,如果确认需要重建,请先调用deleteTaskType(String baseTaskType)删除");
        }
    }

    如果是更新的话,就不会再创建任务永久节点了,直接修改任务节点内容即可。

    3.3 策略创建节选

    策略创建提交保存为入口,将参数封装到ScheduleStrategy对象中,调用节点创建和更新方法:

    //scheduleStrategyEdit.jsp->scheduleStrategyDeal.jsp
    
    if (action.equalsIgnoreCase("createScheduleStrategy")) {
        ConsoleManager.getScheduleStrategyManager().createScheduleStrategy(scheduleStrategy);
        isRefreshParent = true;
    } else if (action.equalsIgnoreCase("editScheduleStrategy")) {
        ConsoleManager.getScheduleStrategyManager().updateScheduleStrategy(scheduleStrategy);
        isRefreshParent = true;
    }

    真正执行任务节点及数据处理的代码段:

    //ScheduleStrategyDataManager4ZK.java
    
    public void createScheduleStrategy(ScheduleStrategy scheduleStrategy) throws Exception {
        String zkPath = this.PATH_Strategy + "/"+ scheduleStrategy.getStrategyName();
    
        /** 在 strategy 节点下创建任务永久节点并写入节点内容为任务配置参数 */
        String valueString = this.gson.toJson(scheduleStrategy);
        if ( this.getZooKeeper().exists(zkPath, false) == null) {
            this.getZooKeeper().create(zkPath, valueString.getBytes(), this.zkManager.getAcl(),CreateMode.PERSISTENT);
        } else {
            throw new Exception("调度策略" + scheduleStrategy.getStrategyName() + "已经存在,如果确认需要重建,请先调用deleteMachineStrategy(String taskType)删除");
        }
    }

    如果是更新的话,就不会再创建任务永久节点了,直接修改任务节点内容即可。

    3.4 调度控制节选

    策略调度控制代码段:

    //scheduleStrategyList.jsp->scheduleStrategyDeal.jsp
    
    else if (action.equalsIgnoreCase("deleteScheduleStrategy")) {
        ConsoleManager.getScheduleStrategyManager()
                        .deleteMachineStrategy(
        scheduleStrategy.getStrategyName());
        isRefreshParent = true;
    } else if (action.equalsIgnoreCase("pauseTaskType")) {
        ConsoleManager.getScheduleStrategyManager().pause(
                        scheduleStrategy.getStrategyName());
        isRefreshParent = true;
    } else if (action.equalsIgnoreCase("resumeTaskType")) {
        ConsoleManager.getScheduleStrategyManager().resume(
                        scheduleStrategy.getStrategyName());
        isRefreshParent = true;
    } 

    真正执行任务节点及数据处理的代码段:

    //ScheduleStrategyDataManager4ZK.java
    
    /** 策略删除,即删除strategy下对应的策略节点及数据 */
    public void deleteMachineStrategy(String taskType) throws Exception {
        deleteMachineStrategy(taskType,false);
    }
    
    /** 调度暂停,即修改strategy下对应的策略节点的状态标示数据 */
    public void pause(String strategyName) throws Exception{
        ScheduleStrategy strategy = this.loadStrategy(strategyName);
        strategy.setSts(ScheduleStrategy.STS_PAUSE);
        this.updateScheduleStrategy(strategy);
    }
    
    /** 调度启动,即修改strategy下对应的策略节点的状态标示数据 */
    public void resume(String strategyName) throws Exception{
        ScheduleStrategy strategy = this.loadStrategy(strategyName);
        strategy.setSts(ScheduleStrategy.STS_RESUME);
        this.updateScheduleStrategy(strategy);      
    }

    修改节点数据,通过ZooKeeper的事件通知机制,让执行机获得变更通知。

    4. 与其他开源调度框架对比

    1)Quartz:Java事实上的定时任务标准。但Quartz关注点在于定时任务而非数据,并无一套根据数据处理而定制化的流程。虽然Quartz可以基于数据库实现作业的高可用,缺少分布式并行执行作业的功能。

    2)Crontab:Linux系统级的定时任务执行器,缺乏分布式和集中管理功能。

    3)elastic-job:当当网最近开源项目,功能跟TBSchedule几乎一样(批斗TBSchedule文档缺失严重),一台服务器只能开启一个任务实例,基于Ip不基于IpPort,单机难调试集群功能。

    4)TBSchedule:淘宝早期开源,稳定性可以保证。


    第二部分 TBSchedule分布式调度示例

    1. TBSchedule源码下载

    下载TBSchedule源码工程,内容包括两部分:工程编译成jar的任务开发依赖包和工程编译成war的调度控制台。

    2. 引入源码Demo开发示例

    当前示例与Spring集成,源码可作为普通工程依赖入任务工程,也可将其打包成jar并引入依赖,此处版本为3.2.2.2

    补充:若打包失败,请检查编译插件版本及jdk编译版本。

    任务工程依赖

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

    调度任务实现IScheduleTaskDealSingle,并实现selectTasksexecute方法,详细示例:

    Component("iScheduleTaskDealSingleTest")
    public class IScheduleTaskDealSingleTest implements IScheduleTaskDealSingle<TaskModel> {
    
        private static final Logger LOG = LoggerFactory.getLogger(IScheduleTaskDealSingleTest.class);
    
        @Override
        public Comparator<TaskModel> getComparator() {
            return null;
        }
    
        @Override
        public List<TaskModel> selectTasks(String taskParameter, String ownSign, int taskQueueNum,
                List<TaskItemDefine> taskItemList, int eachFetchDataNum) throws Exception {
    
            LOG.info("IScheduleTaskDealSingleTest配置的参数,taskParameter:{},ownSina:{},taskQueueNum:{},taskItemList:{}, eachFetchDataNum:{}", taskParameter, ownSign, taskQueueNum, taskItemList, eachFetchDataNum);
    
            LOG.info("IScheduleTaskDealSingleTest选择任务列表开始啦..........");
            List<TaskModel> models = new ArrayList<TaskModel>();
            models.add(new TaskModel(String.valueOf(System.currentTimeMillis()), "taosirTest1"));
            models.add(new TaskModel(String.valueOf(System.currentTimeMillis()), "taosirTest2"));
    
            return models;
    
        }
    
        @Override
        public boolean execute(TaskModel model, String ownSign) throws Exception {
    
            LOG.info("IScheduleTaskDealSingleTest执行开始啦.........." + new Date());
            System.out.println(model);
            return true;
    
        }
    
    }
    

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

    将调度任务注册到zookeeper中心,spring中引入如下配置:

    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
    <beans default-autowire="byName">
        <bean id="scheduleManagerFactory"
            class="com.taobao.pamirs.schedule.strategy.TBScheduleManagerFactory"
            init-method="init">
            <property name="zkConfig">
                <map>
                    <entry key="zkConnectString" value="${schedule.zookeeper.address}" />
                    <entry key="rootPath" value="${schedule.root.catalog}" />
                    <entry key="zkSessionTimeout" value="${schedule.timeout}" />
                    <entry key="userName" value="${schedule.username}" />
                    <entry key="password" value="${schedule.password}" />
                    <entry key="isCheckParentPath" value="true" />
                </map>
            </property>
        </bean>
    </beans>

    环境属性配置文件增加如下配置:

    #注册中心地址
    schedule.zookeeper.address=172.26.50.86:2181
    #定时任务根目录,任意指定,调度控制台配置时对应
    schedule.root.catalog=/tbschedule/example
    #账户,任意指定,调度控制台配置时对应
    schedule.username=username
    #密码,任意指定,调度控制台配置时对应
    schedule.password=password
    #超时配置
    schedule.timeout=60000

    启动容器,iScheduleTaskDealSingleTest就完成了到zookeeper中心的注册。

    补充:TBSchedule提供了IScheduleTaskDealSingle和IScheduleTaskDealMulti两个接口,个人在测试中发现两者除了execute方法上参数不同外,功能上并没有别的不同,只是语义上的区分,在处理模式为SLEEP下getComparator()没有用,一般情况下,都是SLEEP模式。

    3. 控制台配置任务调度

    将控制台ScheduleConsole.war部署到tomcat容器。

    补充:我通过ant运行源码中的build.xml构建控制台,部署运行失败(没用过ant,目前不知道原因),这种情况下:

    使用方式一,直接用下载包中的控制台部署即可。
    使用方式二,修改工程配置打成war包,这灵活,还可以自定义修改,源文件不支持中文,可将编码改成utf-8支持。

    向注册中心注册配置(跟任务注册用同一根目录,官方wiki图示)
    http://{server}:{port}/ScheduleConsole/schedule/config.jsp

    配置调度任务(官方wiki图示)
    http://{server}:{port}/ScheduleConsole/schedule/index.jsp

    4. selectTasks方法参数说明

    taskParameter:对应控制台自定义参数,可自定义传入做逻辑上的操作

    taskQueueNum:对应控制台任务项数量

    taskItemList:集合中TaskItemDefine的id值对应任务项值,多线程处理时,根据任务项协调数据一致性和完整性

    eachFetchDataNum:对应控制台每次获取数量,由于子计时单元开始后,会不断的去取数据进行处理,直到取不到数据子计时才停止,等待下一个子计时开始。可以限制每次取数,防止一次性数据记录过大,内存不足。

    ownSign:环境参数,一般没什么用

    5. 创建调度策略参数说明

    策略名称:策略标示,可任意填写

    任务类型:一般保持默认Schedule

    任务名称:对应任务栏被调度任务名称

    任务参数:一般不用,保持默认

    单JVM最大线程组数量:单个JVM允许开启的线程数

    最大线程组数量:多处理机情况下的线程总数限制(总线程为2,任务项线程为4是没有意义的)

    IP地址127.0.0.1或者localhost会在所有机器上运行,注意多处理机若没有根据任务子项划分数据处理,会导致多处理机重复处理数据,谨慎配置

    创建示例,官方wiki上有图示,上面主要是各参数的具体含义。

    6. 创建任务参数说明

    任务名称:策略调度的标示,一旦创建保存,不可更改

    任务处理的SpringBean:注册到spring的任务bean,如iScheduleTaskDealSingleTest

    心跳频率/假定服务死亡时间/处理模式/没有数据时休眠时长/执行结束时间:一般保持默认即可

    线程数:处理该任务的线程数,在没有划分多任务项的情况下,多线程是没有意义的,且线程数量大于任务项也是没有意义的(线程数小于等于任务项),注意如果开启多线程,必须对数据做任务项过滤

    单线程组最大任务项:配置单JVM处理的最大任务项数量,多任务项情况下,可按需限制,一般默认,多执行机会均衡分配

    每次获取数量:子计时单元开始,线程会不断的去获取数据(每次获取的限制)并处理数据,直到获取不到数据子计时才结束(方法内不用就可以随意配置)

    每次执行数量://还没测试过(可能是将获取的数量拆分多次执行)

    每次处理完休眠时间:子计时单元开始,只要有数据,就会不停的获取不停的处理,这个时间设置后,子计时单元开始每次获取执行后,不管还有没有待数据,都先歇会儿再获取处理

    自定义参数:可自定义控制任务逻辑操作

    任务项:这项很重要,在多线程情况下,划分任务项是有意义的,但是要注意必须通过任务项参数,协调待处理数据,否则多线程会重复处理

    创建示例,官方wiki上有图示,上面主要是各参数的具体含义。

    展开全文
  • 开源调度框架Quartz最佳实践

    千次阅读 2014-06-26 13:37:07
    开源调度框架Quartz最佳实践作者:chszs,转载需注明。博客主页:http://blog.csdn.net/chszsQuartz是一个Java调度框架,当前的最新版本为2.2.1。以Quartz 2.2.1版为例,Quartz最佳实践(用于生产系统)总结如下:1...
    开源调度框架Quartz最佳实践

    作者:chszs,转载需注明。博客主页:http://blog.csdn.net/chszs

    Quartz是一个Java调度框架,当前的最新版本为2.2.1。


    以Quartz 2.2.1版为例,Quartz最佳实践(用于生产系统)总结如下:

    1、跳过更新检查
    Quartz内置了一个“更新检查”特性,因此Quartz项目每次启动后都会检查官网,Quartz是否存在新版本。这个检查是异步的,不影响Quartz项目本身的启动和初始化。
    可以在Quartz配置文件中,设置org.quartz.scheduler.skipUpdateCheck的属性为true来跳过更新检查。

    2、JobDataMap技巧
    在JobDataMap应该只存储原始的数据类型(包括字符串),这样可以避免数据序列化的问题以及长期运行的问题。

    3、使用合并后的JobDataMap
    官方推荐,Job.execute()方法通常应该从JobExecutionContext发现的JobDataMap中取回数据,而不是直接从JobDetail中取数据。

    4、使用TriggerUtils
    TriggerUtils工具类作用如下:
    1)提供了一种更简单的创建触发器的方式;
    2)提供了带调度器创建触发器的各种方法来满足特殊需求,与直接初始化特殊类型的触发器(SimpleTrigger、CronTrigger),然后调用各种setter方法进行配置相反。
    3)提供了更为简单的创建日期时间的方法;
    4)提供了辅助类来分析触发器(比如计算未来的激活次数等)。

    5、一定不要直接写数据到Quartz表
    通过SQL语句写调度数据到数据库表,而不应该使用调度API来写数据,因为:
    1)会导致数据冲突(删除数据、争夺的数据)。
    2)会导致当触发器的激活时间到了时,Job会看起来不见了。
    3)会导致当触发器的激活时间到了时,Job会不执行,看起来“仅仅坐在那儿”。
    4)可能会导致死锁
    5)还可能导致其他奇怪的问题和数据崩溃等

    6、一定不要把多个非集群的调度器实例指向同一个数据库表
    如果把多个调度器实例指向同一个数据库表,而且这些调度器实例没有做集群配置,那么可能会发生:
    1)会导致数据冲突(删除数据、争夺的数据)。
    2)会导致当触发器的激活时间到了时,Job会看起来不见了。
    3)会导致当触发器的激活时间到了时,Job会不执行,看起来“仅仅坐在那儿”。
    4)可能会导致死锁
    5)还可能导致其他奇怪的问题和数据崩溃等

    7、确保适合的数据源连接数
    官方推荐数据源的最大连接数应该配置为线程池的最小工作线程数的3倍。如果你还需要额外的连接(比如频繁地调用调度器API),如果还使用了JobStoreCMT,那么非托管的数据源的最大连接数应该是至少4倍以上。

    8、避免调度Job的时间安排在夏令时转换的交界处
    SimpleTrigger触发器不受此影响。

    9、等待条件
    如果连接池所有的线程都处于繁忙状态,那么长期运行的Job会阻止其他Job的运行。
    如果在工作线程执行Job时调用Thread.sleep()后,Job余下的工作有可能得不到执行,因为会等待一些条件(比如数据记录有效后)为真后再执行。
    最佳的解决方案是释放工作线程(退出Job),允许其他Job在线程上得到执行。Job可以重新调度自身,或者等其他Job在退出前调度它。

    10、Job抛出异常
    Job执行方法应该包含try-catch代码块,以处理各种可能发生的异常。
    如果Job抛出异常,Quartz通常会立即重新执行(看起来会再次抛出同样的异常)。最佳的方式是让Job能够捕获它可能会遇到的所有异常,处理这些异常,然后再重调度Job。

    11、可恢复性和幂等性
    标记为“可恢复的”、在进行中的Job在调度器失效后是可以自动重新执行的。这意味着同样的Job工作可能会执行两次。

    12、在监听器中保持代码简洁高效
    不鼓励监听器内执行大量的工作,执行Job或完成触发器并激活另一个Job等,都应该绑定到监听器。

    13、监听器抛出异常
    每个监听器(TriggerListener、JobListener和SchedulerListener)应该包含try-catch代码块,以处理各种可能发生的异常。
    如果监听器抛出异常,它或许会导致其他监听器得不到通知或阻止Job的执行等等。

    14、注意安全
    一些开发者会通过应用程序的用户接口暴露Quartz调度器的功能,这很有用,但也很危险。因为恶意用户可以通过这种方式控制或破坏您的系统。
    展开全文
  • Hadoop 开源调度系统zeus(二)

    千次阅读 2014-06-22 18:41:42
    紧跟之前Hadoop 开源调度系统zeus(一) 本节主要介绍一下
  • java开源调度调度框架

    千次阅读 2014-01-04 23:49:32
    Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的日程序表。Jobs可以...
  • 开源调度系统hello job

    千次阅读 2018-05-19 20:55:31
    Hello Job调度系统 系统简介: 本系统使用java开发,支持时间调度、作业依赖触发、手工执行三种调度方式。 时间调度:底层基于quartz实现,支持cron命令,实现灵活的时间调度方式。 作业依赖触发:一个子作业...
  • 开源调度器的评价

    2016-05-16 10:30:38
    可见,这些诞生于互联网行业的开源的集群调度器,和闭源调度器还是有一定差距的,这些闭源调度器和HPC领域里存在已久的资源调度器,差距又是很大的。 再转一句评论,忘记在哪里看到的了: “那些传统集群调度器开发...
  • Hadoop 开源调度系统zeus

    千次阅读 2016-08-29 13:32:08
    对海量数据进行处理时,目前大部分公司都采用Hadoop来对数据进行离线处理,但是由于业务场景,经常一个...才能执行任务2、任务2执行完成之后才能执行任务3和4,在这种情况下需要一套调度系统把各个任务之间的依赖
  • TASKCTL在ETL工具批量调度领域,是国内首款c语言开源软件。不依赖任何数据库、中间件等第三方技术平台。保证100% free,绝无黑盒代码。它志在促进该领域的独立发展,使调度在ETL领域独立化、专业化、系统化。从而...
  • Hadoop 开源调度系统zeus(一)

    千次阅读 2014-07-01 10:55:54
    对海量数据进行处理时,目前大部分公司...才能执行任务2、任务2执行完成之后才能执行任务3和4,在这种情况下需要一套调度系统把各个任务之间的依赖关系串联起来, 目前来说,有很多开源的系统,最著名的应该算是Apac

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 132,268
精华内容 52,907
关键字:

开源调度