定时任务 :

主要功能:监听zookeeper状态,正常则this.factory.refresh(),异常则this.factory.reStart();

1 正常情况this.factory.refresh()

异常则停止所有调度任务

正常则重新分配调度器

1.1分配调度器

  1. public void reRegisterManagerFactory() throws Exception{
  2. //重新分配调度器
  3. List<String> stopList = this.getScheduleStrategyManager().registerManagerFactory(this);
  4. for (String strategyName : stopList) {
  5. this.stopServer(strategyName);
  6. }
  7. this.assignScheduleServer();
  8. this.reRunScheduleServer();
  9. }

1.1.1 this.assignScheduleServer();

  1. /**
  2. * 根据策略重新分配调度任务的机器
  3. * @throws Exception
  4. */
  5. public void assignScheduleServer() throws Exception{
  6. for(ScheduleStrategyRunntime run: this.scheduleStrategyManager.loadAllScheduleStrategyRunntimeByUUID(this.uuid)){
  7. List<ScheduleStrategyRunntime> factoryList = this.scheduleStrategyManager.loadAllScheduleStrategyRunntimeByTaskType(run.getStrategyName());
  8. if(factoryList.size() == 0 || this.isLeader(this.uuid, factoryList) ==false){
  9. continue;
  10. }
  11. ScheduleStrategy scheduleStrategy =this.scheduleStrategyManager.loadStrategy(run.getStrategyName());
  12. int[] nums = ScheduleUtil.assignTaskNumber(factoryList.size(), scheduleStrategy.getAssignNum(), scheduleStrategy.getNumOfSingleServer());
  13. for(int i=0;i<factoryList.size();i++){
  14. ScheduleStrategyRunntime factory = factoryList.get(i);
  15. //更新请求的服务器数量
  16. this.scheduleStrategyManager.updateStrategyRunntimeReqestNum(run.getStrategyName(),
  17. factory.getUuid(),nums[i]);
  18. }
  19. }
  20. }
  • 从策略目录获取所有策略信息

    策略目录/tbSchedule/zmlTbScheduleTest/strategy

    策略信息
  1. [ScheduleStrategyRunntime [strategyName=DBDemoSingle-stratrery,
  2. uuid=192.168.255.1$zhuml$69F86F4CFF4E4DA397880E19411DF068$0000000005,
  3. ip=null, kind=null, taskName=null, taskParameter=null, requestNum=0, currentNum=0, message=]]
  • 再根据策略名字DBDemoSingle-stratrery,获取策略详细信息

    目录路径:/tbSchedule/zmlTbScheduleTest/strategy/DBDemoSingle-stratrery
  1. {"strategyName":"DBDemoSingle-stratrery","IPList":["127.0.0.1"],"numOfSingleServer":0,"assignNum":4,
  2. "kind":"Schedule","taskName":"DBDemoSingle_task","taskParameter":"","sts":"resume"}
  • 然后任务分片,并把分片信息写到zookeeper上

    路径 /tbSchedule/zmlTbScheduleTest/strategy/DBDemoSingle-stratrery/192.168.10.249$zhuml$43AB1F13800E4469BBB2DD385C6A0193$0000000006

    data:
  1. [{"strategyName":"DBDemoSingle-stratrery","uuid":"192.168.10.249$zhuml$43AB1F13800E4469BBB2DD385C6A0193$0000000006","requestNum":4,"currentNum":0,"message":""}]

1.1.2 运行 this.assignScheduleServer();

  1. public void reRunScheduleServer() throws Exception{
  2. for (ScheduleStrategyRunntime run : this.scheduleStrategyManager.loadAllScheduleStrategyRunntimeByUUID(this.uuid)) {
  3. List<IStrategyTask> list = this.managerMap.get(run.getStrategyName());
  4. if(list == null){
  5. list = new ArrayList<IStrategyTask>();
  6. this.managerMap.put(run.getStrategyName(),list);
  7. }
  8. while(list.size() > run.getRequestNum() && list.size() >0){
  9. IStrategyTask task = list.remove(list.size() - 1);
  10. try {
  11. task.stop(run.getStrategyName());
  12. } catch (Throwable e) {
  13. logger.error("注销任务错误:strategyName=" + run.getStrategyName(), e);
  14. }
  15. }
  16. //不足,增加调度器
  17. ScheduleStrategy strategy = this.scheduleStrategyManager.loadStrategy(run.getStrategyName());
  18. while(list.size() < run.getRequestNum()){
  19. IStrategyTask result = this.createStrategyTask(strategy);
  20. if(null==result){
  21. logger.error("strategy 对应的配置有问题。strategy name="+strategy.getStrategyName());
  22. }
  23. list.add(result);
  24. }
  25. }
  26. }
  • 获取策略信息,根据分片数量判断是否停止任务或者创建任务

    停止任务stop就ok了

    创建任务 createStrategyTask
  1. /**
  2. * 创建调度服务器
  3. * @param baseTaskType
  4. * @param ownSign
  5. * @return
  6. * @throws Exception
  7. */
  8. public IStrategyTask createStrategyTask(ScheduleStrategy strategy)
  9. throws Exception {
  10. IStrategyTask result = null;
  11. try{
  12. if(ScheduleStrategy.Kind.Schedule == strategy.getKind()){
  13. String baseTaskType = ScheduleUtil.splitBaseTaskTypeFromTaskType(strategy.getTaskName());
  14. String ownSign =ScheduleUtil.splitOwnsignFromTaskType(strategy.getTaskName());
  15. result = new TBScheduleManagerStatic(this,baseTaskType,ownSign,scheduleDataManager);
  16. }else if(ScheduleStrategy.Kind.Java == strategy.getKind()){
  17. result=(IStrategyTask)Class.forName(strategy.getTaskName()).newInstance();
  18. result.initialTaskParameter(strategy.getStrategyName(),strategy.getTaskParameter());
  19. }else if(ScheduleStrategy.Kind.Bean == strategy.getKind()){
  20. result=(IStrategyTask)this.getBean(strategy.getTaskName());
  21. result.initialTaskParameter(strategy.getStrategyName(),strategy.getTaskParameter());
  22. }
  23. }catch(Exception e ){
  24. logger.error("strategy 获取对应的java or bean 出错,schedule并没有加载该任务,请确认" +strategy.getStrategyName(),e);
  25. }
  26. return result;
  27. }

创建任务有三种类型 public enum Kind{Schedule,Java,Bean}

这里只介绍Schedule:result = new TBScheduleManagerStatic(this,baseTaskType,ownSign,scheduleDataManager);

TBSchedule源码阅读2-TBScheduleManagerFactory 定时任务ManagerFactoryTimerTask的更多相关文章

  1. TBSchedule源码阅读1-TBScheduleManagerFactory

    TBSchedule 1 TBScheduleManagerFactory 初始化    成员变量    ZKManager;    IScheduleDataManager;    Schedule ...

  2. [源码阅读] 阿里SOFA服务注册中心MetaServer(2)

    [源码阅读] 阿里SOFA服务注册中心MetaServer(2) 目录 [源码阅读] 阿里SOFA服务注册中心MetaServer(2) 0x00 摘要 0x01 MetaServer 注册 1.1 ...

  3. 【原】FMDB源码阅读(三)

    [原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...

  4. 【原】FMDB源码阅读(二)

    [原]FMDB源码阅读(二) 本文转载请注明出处 -- polobymulberry-博客园 1. 前言 上一篇只是简单地过了一下FMDB一个简单例子的基本流程,并没有涉及到FMDB的所有方方面面,比 ...

  5. 【原】FMDB源码阅读(一)

    [原]FMDB源码阅读(一) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 说实话,之前的SDWebImage和AFNetworking这两个组件我还是使用过的,但是对于 ...

  6. 【原】AFNetworking源码阅读(六)

    [原]AFNetworking源码阅读(六) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这一篇的想讲的,一个就是分析一下AFSecurityPolicy文件,看看AF ...

  7. 【原】AFNetworking源码阅读(五)

    [原]AFNetworking源码阅读(五) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇中提及到了Multipart Request的构建方法- [AFHTTP ...

  8. 【原】AFNetworking源码阅读(四)

    [原]AFNetworking源码阅读(四) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇还遗留了很多问题,包括AFURLSessionManagerTaskDe ...

  9. 【原】AFNetworking源码阅读(三)

    [原]AFNetworking源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇的话,主要是讲了如何通过构建一个request来生成一个data tas ...

随机推荐

  1. Kubernetes环境下如何运行Coherence缓存集群

    Oracle官方出了一个如何在Docker环境下运行Coherence的技术文档,大家可以参考: https://github.com/oracle/docker-images/tree/master ...

  2. 顶点缓存对象(VBO)【转】

    http://www.cnblogs.com/hefee/p/3824300.html 顶点缓存对象(VBO) 创建VBO 绘制VBO 更新VBO 实例 GL_ARB_vertex_buffer_ob ...

  3. 伟大的UHD编解码器的辩论:谷歌VP9与HEVC / H.265

    伟大的UHD编解码器的辩论:谷歌VP9与HEVC / H.265 截至今天,伟大的UHD编解码器的争论涉及两个主要参与者:谷歌VP9和HEVC / H.265. 哪一个获得成功并where-invol ...

  4. Java 多线程之 synchronized 和 volatile 的比較

    概述 在做多线程并发处理时,常常须要对资源进行可见性訪问和相互排斥同步操作.有时候,我们可能从前辈那里得知我们须要对资源进行 volatile 或是 synchronized 关键字修饰处理.但是,我 ...

  5. rpm安装找不到.so库文件(linux动态库连接的相关知识)(转)

    1.找不到库文件的原因 库文件不存在 这种情况一般是因为所需要的包没装,只要安装相应的包就可以解决 存在而系统不知道 这种情况一般出现在自己编译软件时候 确保库文件所在的路径已加入系统,在/etc/l ...

  6. ROS示例----导航功能包Husky_exploration

    ROS导航功能包示例husky amcl gmapping slam exploration 此功能包包含如下文件: 结构如下: $ tree -L 2 . ├── CMakeLists.txt -& ...

  7. 阿里云dataworks数据工场用户使用子账号

    如果您是第一次使用子账号登录数加平台和使用DataWorks,您需要获知以下内容: 该子账号所属主账号的企业别名. 该子账号的用户名和密码. 该子账号的AccessKey ID和AccessKey S ...

  8. Zabbix触发器函数(取前后差值)

    获取最新值last zabbix触发器方法last用于获取item最新值或者第几个值以及某个时间的哪一个值. Last (most recent) T value is > N Last (mo ...

  9. python challenge答案参考

    Solutions to python challenge. http://garethrees.org/2007/05/07/python-challenge/ https://github.com ...

  10. VIM-不常用或不知道的技巧

    cc 清除一行 并在本行编辑, 同理 cw :32,65d 多行删除 g/pattern/d 删除包含特定字符的行 v/pattern/d 删除不包含指定字符的行 等同于 g!/pattern/d y ...