定时任务 :

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

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

异常则停止所有调度任务

正常则重新分配调度器

1.1分配调度器

	public void reRegisterManagerFactory() throws Exception{
//重新分配调度器
List<String> stopList = this.getScheduleStrategyManager().registerManagerFactory(this);
for (String strategyName : stopList) {
this.stopServer(strategyName);
}
this.assignScheduleServer();
this.reRunScheduleServer();
}

1.1.1 this.assignScheduleServer();

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

    策略目录/tbSchedule/zmlTbScheduleTest/strategy

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

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

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

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

1.1.2 运行 this.assignScheduleServer();

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

    停止任务stop就ok了

    创建任务 createStrategyTask
	/**
* 创建调度服务器
* @param baseTaskType
* @param ownSign
* @return
* @throws Exception
*/
public IStrategyTask createStrategyTask(ScheduleStrategy strategy)
throws Exception {
IStrategyTask result = null;
try{
if(ScheduleStrategy.Kind.Schedule == strategy.getKind()){
String baseTaskType = ScheduleUtil.splitBaseTaskTypeFromTaskType(strategy.getTaskName());
String ownSign =ScheduleUtil.splitOwnsignFromTaskType(strategy.getTaskName());
result = new TBScheduleManagerStatic(this,baseTaskType,ownSign,scheduleDataManager);
}else if(ScheduleStrategy.Kind.Java == strategy.getKind()){
result=(IStrategyTask)Class.forName(strategy.getTaskName()).newInstance();
result.initialTaskParameter(strategy.getStrategyName(),strategy.getTaskParameter());
}else if(ScheduleStrategy.Kind.Bean == strategy.getKind()){
result=(IStrategyTask)this.getBean(strategy.getTaskName());
result.initialTaskParameter(strategy.getStrategyName(),strategy.getTaskParameter());
}
}catch(Exception e ){
logger.error("strategy 获取对应的java or bean 出错,schedule并没有加载该任务,请确认" +strategy.getStrategyName(),e);
}
return result;
}

创建任务有三种类型 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. ILSpy反编译软件的使用

    早期.Net平台下的反编译软件一般用reflector,但自从其商业化后就没有使用了,现在主要用ILSpy查看dll的源码,其开源.免费的特点很快就流行开来,功能和性能丝毫不逊于reflector   ...

  2. nginx+lua+redis

    git clone --branch master https://github.com/openresty/lua-resty-redis.git yum install openssl opens ...

  3. OpenWrt 路由器过滤广告的N种方法

    路由器已经成为每个家庭不可缺少的角色,手机.电脑.电视,凡是需要互联网的设备都要用到它.那么路由器除了给我们的网络设备分发网络外,还有其他用途吗? 现在很多人家里都用着智能路由器,智能路由器究竟怎么智 ...

  4. Server 2008 R2 安装活动目录和配置DNS及故障解决

    一.安装windows2008_64bit_r2 给服务器设置密码:xxxxxxxx 二.安装配置DNS规则 1.更改服务器主机名:DCserver 2.配置静态IP地址 IP地址:10.0.100. ...

  5. 全面了解linux服务器

    一.查看linux服务器CPU详细情况 判断linux服务器CPU情况的依据如下 具有相同core id的CPU是同一个core的超线程 具有相同physical id的CPU是同一个CPU封装的线程 ...

  6. Ubuntu ssh 代理

    ssh代理命令 ssh -qTfnN -D 端口  用户名@远程机器地址 ssh全局代理 proxychains 程序 参数 proxychains 可以把从命令行启动的程序,用上ssh代理 prox ...

  7. Spark Streaming揭秘 Day2-五大核心特征

    Spark Streaming揭秘 Day2 五大核心特征 引子 书接上回,Streaming更像Spark上的一个应用程序,会有多个Job的配合,是最复杂的Spark应用程序.让我们先从特征角度进行 ...

  8. JsonFX 序列化反序列化

    /// <summary> /// Json 序列化工具类 /// </summary> public class SerializeJsonUtility { /// < ...

  9. selenium从入门到应用 - 7,testNG的DataProvider

    本系列所有代码 https://github.com/zhangting85/simpleWebtest 本文将介绍一个Java+TestNG+Maven+Selenium的web自动化测试脚本环境下 ...

  10. PNP管理器简析--基于ReactOS0.33

    CSDN上转悠了一圈发现关于PNP管理的文章不多.那就由我献个丑,记录自己对PNP管理器的看法. pnp管理器被描写叙述为向内核和应用程序提供关于设备拔插的通知,凭感觉,pnp管理器应该是个线程函数等 ...