cloudstack management与agent交互
2015-10-15 20:52
309 查看
在cloudstack management端,AgentManagerImpl组件负责与agent通信。
在AagentManagerImpl组件中的configure()中对相关线程初始化
_executor = new ThreadPoolExecutor(threads, threads, 60l, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(), new NamedThreadFactory("AgentTaskPool")); _connectExecutor = new ThreadPoolExecutor(100, 500, 60l, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(), new NamedThreadFactory("AgentConnectTaskPool")); //allow core threads to time out even when there are no items in the queue _connectExecutor.allowCoreThreadTimeOut(true); _connection = new NioServer("AgentManager", Port.value(), Workers.value() + 10, this); s_logger.info("Listening on " + Port.value() + " with " + Workers.value() + " workers"); // executes all agent commands other than cron and ping _directAgentExecutor = new ScheduledThreadPoolExecutor(DirectAgentPoolSize.value(), new NamedThreadFactory("DirectAgent")); // executes cron and ping agent commands _cronJobExecutor = new ScheduledThreadPoolExecutor(DirectAgentPoolSize.value(), new NamedThreadFactory("DirectAgentCronJob")); s_logger.debug("Created DirectAgentAttache pool with size: " + DirectAgentPoolSize.value()); _directAgentThreadCap = Math.round(DirectAgentPoolSize.value() * DirectAgentThreadCap.value()) + 1; // add 1 to always make the value > 0 _monitorExecutor = new ScheduledThreadPoolExecutor(1, new NamedThreadFactory("AgentMonitor"));
在start()函数中对已经连接过的host再次连接(重启),启动NioServer和监视线程池间隔固定时间执行一次监视任务
startDirectlyConnectedHosts();
if (_connection != null) {
_connection.start();
}
_monitorExecutor.scheduleWithFixedDelay(new MonitorTask(), PingInterval.value(), PingInterval.value(), TimeUnit.SECONDS);
return true;
在create函数中创建AgentHandler来处理来自agent端NioClient发过来的NioConnection连接
在agent端会启动agentShell,agentShell读取配置文件agent.properties,从agent.properties文件中读取resource的值,通过反射得到底层hypervisor的资源服务代理类,例如KVM的为com.cloud.hypervisor.kvm.resource.LibvirtComputingResource.
对resource值的每一种hypervisor,启动一个agent组件。
agent组件启动会启动NioClient,NioClient会运行一个Agent-selector的线程运行IO多路复用器/选择器。
Agent-selector的线程初始运行时执行NioClient的init,NioClient的init方法会创建连接到manager的connect socket,并把connetcSocket register到Seletor,然后创建类型为connect的ServerHandler Task,该类型Task向对端发送StartupCommand request, 请对端(management)发送启动本端的资源(系统VM consoleProxy,secondaryStorage等)。
AgentManagerImpl组件与agent组件进行NioClient类与NioSerer类进行异步通信。NioClient类与NioSerer类由Link封装NioConnection进行数据收发。
Agent的NioClient创建ServerHandler Task来处理接收对端NioServer发送的request和respone数据,其中在处理接收request数据时创建AgentRequestHandler Task来执行。 AgentManagerImpl的NioServer创建AgentHandler Task处理对端的request和response数据。
api命令传入ApiServer通过ApiDispatcher调度和AsnyJob管理框架最终执行指定BaseCmd的excute方法,若该命令需要调用agent端,则excute方法会构建特定的command对象,使用AgentManagerImpl的send封装了command对象的request数据给agent端。
相关文章推荐
- usbredir-0.7内容详解(二)
- poj1703 find them,catch them
- fpga闪烁的led灯
- 26.Struts2文件下载并在下载文件之前进行权限检查
- 淘宝异构数据源数据交换工具 DataX
- 移动端Web框架
- hmmer 使用
- lintcode :搜索二维矩阵
- opencv2.4.9 + vs2013 之 blobtrack 调试
- 接口
- xcode APP 打包以及提交apple审核详细流程(新版本更新提交审核)
- EasyUI datagrid checkbox数据设定与取值(转自http://blog.csdn.net/baronyang/article/dnetails/9323463,感谢分享,谢谢)
- #上海ORACLE用户组2014在论坛#时刻
- Codeforces Round #325 (Div. 2) C. Gennady the Dentist(水题)
- Spring 连接MySQL 数据库
- html禁用缓存
- WebKit 加载时加入动画
- DirectShow的配置及从摄像头读取视频并预览
- debian/Ubuntu下postgres的一些操作总结(用户,建库。。。)
- [sicily]1341. 明明的随机数