cloudstack api调度流程

2023-11-17

cloudstackapi调度流程


我们发往cloudstackapi命令由management端的ApiServletprocessRequest(req,resp)进性处理,该函数开启一个线程进行处理。对于loginlogout命令单独处理,其它命令发往ApiServer组件进行处理


finalStringresponse=_apiServer.handleRequest(params,responseType,auditTrailSb);


ApiServer组件的handleRequest函数中,通过解析参数params,构建出cmdObj对象,剩余参数存入paramMap,之后进入命令的调度入口函数queueCommand


//This is where the command is either serialized, or directlydispatched

response= queueCommand(cmdObj,paramMap);



ApiServer组件的queueCommand函数中,会依据cmdObj的类型进行不同的调度路径

//Queue command based onCmdsuper class:

//BaseCmd:cmdis dispatched to ApiDispatcher, executed, serialized and returned.


//BaseAsyncCmd:cmdis processed and submitted as an AsyncJob, job related info isserialized and returned.


//BaseAsyncCreateCmd:cmdparamsare processed and create() is called, then same workflowas BaseAsyncCmd.


下面给出DeployVMCmd创建VM命令的类继承结构


queueCommand函数中,调用逻辑关键代码如下:


if(cmdObjinstanceofBaseAsyncCmd) {


if(cmdObjinstanceofBaseAsyncCreateCmd) {


_dispatcher.dispatchCreateCmd(createCmd,params);

}

else{

dispatchChainFactory.getStandardDispatchChain().dispatch(newDispatchTask(cmdObj,params));

}


AsyncJobVOjob=newAsyncJobVO(...);

job.setDispatcher(_asyncDispatcher.getName());

finallongjobId=_asyncMgr.submitAsyncJob(job);


returngetBaseAsyncResponse(jobId,asyncCmd);


}

else{


_dispatcher.dispatch(cmdObj,params,false);


returnApiResponseSerializer.toSerializedString(...);

}


上面的调度逻辑涉及了5个类:

ApiDispatcher_dispatcher

DispatchChainFactorydispatchChainFactory


ApiAsyncJobDispatcher_asyncDispatcher

AsyncJobVOjob

AsyncJobManager_asyncMgr


2个类是用于直接调度cmd对象。

下面是ApiDispatcher的类图



ApiDispatcherdispatchCreateCmd(createCmd,params)会执行Cmd对象createCmdcreate()方法。

ApiDispatcherdispatch(cmdObj,params,false)会执行Cmd对象cmdObjexecute()

方法。此外,在执行cmd对象方法execute()前,会对cmdObj进行判断


if(cmd instanceof BaseAsyncCmd) {


.....


_asyncMgr.syncAsyncJobExecution((AsyncJob)asyncCmd.getJob(),asyncCmd.getSyncObjType(),asyncCmd.getSyncObjId().longValue(),queueSizeLimit);


.....


}


cmd.execute();



异步调度框架的ApiAsyncJobDispatcher采用了ApiDispatcherdispatch方法来调度cmd对象。


3个类属于异步调度,job管理。

下面是AsyncJob执行流程的顺序图


_asyncMgr.submitAsyncJob(job)开始,调用submitAsyncJob(job,false)函数,该函数将job信息存入到dbasync_job中,之后

messageBus发行submit消息

publishOnEventBus(job,"submit");


调度执行job

scheduleExecution(job,scheduleJobExecutionInContext);


该函数体如下:

privatevoidscheduleExecution(final AsyncJobjob,boolean executeInContext){

Runnablerunnable= getExecutorRunnable(job);

if(executeInContext){

runnable.run();

}else{

if(job.getDispatcher()==null||job.getDispatcher().equalsIgnoreCase("ApiAsyncJobDispatcher"))

_apiJobExecutor.submit(runnable);

else

_workerJobExecutor.submit(runnable);

}

}



传入的scheduleJobExecutionInContextfalse,并且jobDispatcherApiAsyncJobDispatcher,最终会把runnable放入_apiJobExecutor线程池中运行。


跟入getExecutorRunnable(job)会跟踪job的执行流程

关键代码

_jobMonitor.registerActiveTask(runNumber,job.getId());

job执行情况进行监视。

关键代码


if((getAndResetPendingSignals(job)& AsyncJob.Constants.SIGNAL_MASK_WAKEUP)!= 0) {

AsyncJobDispatcherjobDispatcher= getWakeupDispatcher(job);

if(jobDispatcher!=null){

jobDispatcher.runJob(job);

}

...

}else{

AsyncJobDispatcherjobDispatcher= getDispatcher(job.getDispatcher());

if(jobDispatcher!=null){

jobDispatcher.runJob(job);

}

}



job无论是通过Signals被激活还是正常的执行,都会先获取jobjobDispatcher调度器,执行调度器

jobDispatcher.runJob(job)runJob(job)方法。


Api命令的job调度器为ApiAsyncJobDispatcher,进入ApiAsyncJobDispatcherrunJob(job)方法:

ApiAsyncJobDispatcherrunJob(finalAsyncJobjob)方法中,关键代码为


.....

Class<?>cmdClass= Class.forName(job.getCmd());

cmdObj= (BaseAsyncCmd)cmdClass.newInstance();

cmdObj= ComponentContext.inject(cmdObj);

cmdObj.configure();

cmdObj.setJob(job);


.....


//dispatch could ultimately queue the job

_dispatcher.dispatch(cmdObj,params,true);


//serialize this to the asyncjob table

_asyncJobMgr.completeAsyncJob(job.getId(),JobInfo.Status.SUCCEEDED,0,ApiSerializerHelper.toSerializedString(cmdObj.getResponseObject()));


......


job构建cmdObj对象,通过ApiDispatcherdispatch方法来调度cmd对象,调度执行完成后对dbasyncjob相关表进行更改。前面提到过,ApiDispatcherdispatch方法在执行cmd对象方法execute()前,如果cmd对象为BaseAsyncCmd的子类,会调用AsyncJobManagerImpl


syncAsyncJobExecution(AsyncJobjob,StringsyncObjType,longsyncObjId,longqueueSizeLimit)方法。


该方法将待执行job的信息插入db的表sync_queuesync_queue_item中。

之后执行cmd对象的execute()方法。


调度完后,通过AsyncJobManagerImplcompleteAsyncJob(...)方法对dbasync_jobsync_queue_itemsync_queue修改,完成的jobsync_queue_itemsync_queue删除。




本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

cloudstack api调度流程 的相关文章

  • Python 中的自动点击器——2 种简单易行的方法

    在本教程中 我们将了解Python 中的自动答题器 我们将首先了解它的含义以及如何在 Python 中实现它 那么 事不宜迟 让我们进入正题 Auto Clicker是一种 Python 软件 允许用户以较短的时间间隔连续点击鼠标 它由用户
  • Mysql中关于NULL值的处理

    一 Mysql空值介绍 MySQL认为任何和NULL值做比较的表达式的值都为NULL 包括select null null和select null null 在对统计索引列不重复值的数量时如何对待NULL值 MySQL专门提供了一个inno
  • React 练习项目,仿简书博客写作平台

    Introduction 技术栈 react redux react router express Nginx 练习点 redux 连接 react router 路由跳转 scss 样式书写 容器组件与展示组件的设计 express 脚手
  • 【100%通过率 】【华为OD机试c++】人数最多的站点【2023 Q1

    华为OD机试 题目列表 2023Q1 点这里 2023华为OD机试 刷题指南 点这里 题目描述 关注公园园区提供小火车单向通行 从园区站点编号最小到最大通行如1 2 3 4 1 然后供员工在各个办公园区穿梭 通过对公司N个员工调研统计到每个
  • cloudflare解析域名+CDN

    cloudflare解析域名 CloudFlare 是一家全球知名的 CDN 服务商 并且提供了免费的 CDN 套餐 还不限流量 所以我们完全不需要花一分钱就能使用它的 CDN 服务 接下来我就说明如何注册并使用 CloudFlare 1
  • C/C++中的数据结构对齐,#pragma pack() 和 __attribute__

    C C 中的数据结构对齐 总览 数据结构对齐是指在计算机内存中排列和访问数据的方式 它包含三个独立但相关的问题 数据对齐 data alignment 数据结构填充 data structure padding 和打包 packing 当数
  • Servlet传送对象给Applet使用

    前日 一位朋友与我谈论Servlet与Applet共享Java对象的问题 现发表出来与大家分享 文中瑕癖 之处甚多 望各位指教 朋友谈论的需求是这样的 他想通过页面上一个Applet呼叫一个服务器Servlet 而从Servlet产生 一个
  • Anaconda3安装TensorFlow2.0.0镜像并且配置好Jupyter Notebook

    我们安装TensorFlow1 2 1但是后面又要安装Tensorflow2 0 0 那么我们就需要让Tensorflow两个版本在windows电脑下进行共存 首先 我们先下载了anacoda3和配置好了清华镜像 我们打开anaconda
  • 从零开始编译OpenWrt固件

    从零开始编译OpenWrt固件 前言 进来阅读这篇文章的相信都是对OpenWrt有一定的了解的 对于OpenWrt的介绍这里就不再赘述 可以自行查找相关百科了解 OpenWrt是适合于嵌入式设备的一个Linux发行版 可以通过其提供的相关工
  • Docker使用基础命令(记录贴)

    Docker使用基础命令 基础命令 拉取 推送镜像 docker run命令 基础操作 保存镜像并压缩 基础命令 docker images grep xxx docker ps a grep xxx 导入容器 docker load i
  • vue+antD 表格中使用input

    vue antD 表格中使用input 在这里插入代码片

随机推荐

  • 【编程与算法基础】数据结构——时间复杂度与空间复杂度

    文章目录 算法的时间复杂度和空间复杂度 一 前言 1 算法的效率 2 复杂度的表示方法 大O渐进表示法 3 大O渐进表示法的规则 二 时间复杂度 1 时间复杂度的概念 2 简单时间复杂度计算举例 3 复杂时间复杂度的计算举例 三 空间间复杂
  • C++实践之Qt学习(六):Qt设计器之常用控件、布局和样式

    文章目录 常用控件 按钮 普通按钮 单选按钮 多选按钮 其他的按钮 显示控件 标签 其他显示控件 输入控件 数据项控件 容器控件 布局 Qt布局介绍 设置布局的方式 样式 外部样式表 常用控件 按钮 Buttons分类中包含了Qt中常用的按
  • Appium使用教程(七)——获取appPackage和appActivity

    appPackage和appActivity 进行appium自动化测试非常重要的两个参数 我们所测试的APP不同 这两个参数肯定也是不一样的 那如何快速的获取这APP的这两个参数呢 我这里介绍五个方法 方法一 最简单有效的方法 通过cmd
  • Ubuntu 之 docker 无法下载镜像

    问题 使用 docker pull 命令拉取镜像出现如下错误 解决方案 1 在 etc docker 中创建 daemon json 文件 vim etc docker daemon json 2 写入 registry mirrors h
  • Android 夜间模式(白/夜间模式的切换)

    在项目研发中 我们避免不了需求中会应用到夜间模式 这里对它做一些总结以及封装 从API 23后 Android就有自带的api能够实现夜间模式与白天模式的切换 Support Library 23 2 应用于API14 推出了适合Andro
  • 逐点比较法实现直线圆弧插补[数控机床]

    逐点比较法实现不同象限直线 圆弧插补 一 原理介绍 1 1 简介 1 2 逐点比较法偏差计算 直线 1 2 1 第一象限逐点比较法思路 1 2 2 四象限逐点比较法实现思路 1 3 逐点比较法偏差计算 圆弧 1 3 1 第一象限逐点比较法思
  • 笔记:快速上手shell编程

    SHELL学习笔记 变量赋值 赋值 A 10 不允许 赋值时不允许在等号两侧出现空格 A 10 允许 A 10 不允许 A 10 允许 当赋值时需要填充多个空格 可以使用 环境变量 root localhost gitee echo PWD
  • tf1.x和tf2.x查看TFRecord数据的方法

    Tensorflow 1 x和Tensorflow 2 x读取tfrecord方法略有不同 下面分别记录两段代码 Tensorflow 1 x for example in tf python io tf record iterator p
  • React基础之Refs的理解与使用

    目录 为什么会用到Refs 何时使用Refs Refs有哪些使用方式 字符串形式的refs 回调形式的refs createRef的使用 为什么会用到Refs 我们在使用React写代码的时候对Refs的使用比较少 因为我们很少直接操作底层
  • 常用DOC命令

    copy con 123 bat 创建批处理 color 改变cmd颜色 ping t l 65550 ip 死亡之ping ipconfig 查看ip ipconfig release 释放ip ipconfig renew 重获ip s
  • arm下蜂鸣器测试代码

    首先还是看内核蜂鸣器的实现 如下图 这个和led一样 都是比较简单的字符驱动 代码如下 include
  • JS 触发事件整理

    一般事件 onclick IE3 N2鼠标点击时触发此事件 ondblclick IE4 N4鼠标双击时触发此事件 onmousedown IE4 N4按下鼠标时触发此事件 onmouseup IE4 N4鼠标按下后松开鼠标时触发此事件 o
  • Android 最简单的应用间跳转小结

    不明所以的图示 通过 JumpOrigin 可以打开 JumpMe 以下简结了4种方式 1 通过查找包名直接启动 APP 这种方法最直接 通过解析包名 判断该应用是否安装 如果安装了就可以直接启动 也能够传递参数 代码如下 傻瓜式打开应用
  • 数据质量评价体系参考

    数据质量人人有责 这不仅仅只是一句口号 更是数据工作者的生命线 数据质量的好坏直接决定着数据价值高低 数据质量管理是指在数据创建 加工 使用和迁移等过程中 通过开展数据质量定义 过程控制 监测 问题分析和整改 评估与考核等一系列管理活动 提
  • MySQL--慢查询

    MySQL的慢查询日志是MySQL提供的一种日志记录 它用来记录在MySQL中响应时间超过阀值的语句 具体指运行时间超过long query time值的SQL 则会被记录到慢查询日志中 具体指运行时间超过long query time值的
  • 第8章 动态注入技术

    转自 http www epubit com cn book onlinechapter 33620 Android安全技术揭秘与防范 我们在讨论动态注入技术的时候 APIHook的技术由来已久 在操作系统未能提供所需功能的情况下 利用AP
  • 使用AVPlayer播放视频

    iOS里面视频播放用到的是AVPlayer 包含在AVFoundation框架内 与AVAudioplayer有点类似 但是AVPlayer得功能跟加强大 他可以用来播放音频也可以用来播放视频 而且在播放音频方面能直接播放网络音频 要使用A
  • 每天一道leetcode141-环形链表

    考试结束 班级平均分只拿到了年级第二 班主任于是问道 大家都知道世界第一高峰珠穆朗玛峰 有人知道世界第二高峰是什么吗 正当班主任要继续发话 只听到角落默默想起来一个声音 乔戈里峰 前言 2018 11 8号打卡明天的题目 https lee
  • py去除文件空行

    去除d0 txt中空行并保存在d1 txt 如果要删除带有空格的空行 可以考虑把判断条件换成正则 with open d0 txt r encoding utf 8 as f open d1 txt w encoding utf 8 as
  • cloudstack api调度流程

    cloudstackapi调度流程 我们发往cloudstack的api命令由management端的ApiServlet的processRequest req resp 进性处理 该函数开启一个线程进行处理 对于login和logout命