核心类:

ZorkaAsyncThread.java

protected BlockingQueue<T> submitQueue;

/**
* Processes single item from submit queue (if any).
*/
public void runCycle() {
try {
T obj = submitQueue.take();
if (obj != null) {
List<T> lst = new ArrayList<T>(plen);
lst.add(obj);
if (plen > 1) {
submitQueue.drainTo(lst, plen-1);
}
process(lst);
flush();
}
} catch (InterruptedException e) {
log.error(ZorkaLogger.ZAG_ERRORS, "Cannot perform run cycle", e);
}
}
/**
* Submits object to a queue.
*
* @param obj object to be submitted
*/
public boolean submit(T obj) {
try {
return submitQueue.offer(obj, 1, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
return false;
}
}

主要分为两个关键流程:

  1. ZorkaAgent插桩之后将record提交到相应线程对象的队列submitQueue
  2. beanshell创建线程,线程启动后,从提交队列submitQueue里不断取记录进行处理并发送到目标终端(日志或者其他监控平台)。

一、ZorkaAgent将record提交到队列
插桩过程中的probe会调用MainSubmitter的traceEnter、traceReturn、traceError、submit四个方法,它们主要用于处理trace record,并提交到相应的队列。

在traceReturn、traceError底层会调用pop()、pop()方法底层调用ZorkaAsyncThread继承类里实现的submit方法,将record提交到队列。

二、从队列获取record并处理,发送到目标流。
tracer.bsh创建异步线程,线程启动后,自动从队列获取record对象,处理并发送。每个线程对应一种tracer方式。

ZorkaAsyncThread是一个抽象类,有很多继承,比如ZabbixTrapper、SnmpTrapper、ZicoTraceOutput等。
继承类里面实现的process方法用于讲最终的record提交到目的流。submit方法用于将record提交到待处理队列。

zorka源码解读之tracer内部实现的更多相关文章

  1. zorka源码解读之通过beanshell进行插桩的流程

    zorka中插桩流程概述 1.在SpyDefinition中配置插桩属性,将SpyDefinition实例提交给插桩引擎.2.SpyDefinition实例中包含了插桩探针probes,probe插入 ...

  2. zorka源码解读之Instrument实现原理

    主要用到三方面技术: beanshell来实现可扩展:告诉zorkaAgent插桩的具体需求,包括插桩的方法和值.插桩的时机.插桩追踪记录方式等. Instrument来通过代理的方式访问JVM,实现 ...

  3. zorka源码解读之Beanshell与zorka的交互实现

    一.beanshell基础知识从应用程序中调用BeanShell创建一个BeanShell的解释器(interpreter)用eval()和source()命令可以对一个字符串求值和运行一个脚本文件使 ...

  4. SDWebImage源码解读之SDWebImageCache(下)

    第六篇 前言 我们在SDWebImageCache(上)中了解了这个缓存类大概的功能是什么?那么接下来就要看看这些功能是如何实现的? 再次强调,不管是图片的缓存还是其他各种不同形式的缓存,在原理上都极 ...

  5. AFNetworking 3.0 源码解读 总结(干货)(上)

    养成记笔记的习惯,对于一个软件工程师来说,我觉得很重要.记得在知乎上看到过一个问题,说是人类最大的缺点是什么?我个人觉得记忆算是一个缺点.它就像时间一样,会自己消散. 前言 终于写完了 AFNetwo ...

  6. AFNetworking 3.0 源码解读(十)之 UIActivityIndicatorView/UIRefreshControl/UIImageView + AFNetworking

    我们应该看到过很多类似这样的例子:某个控件拥有加载网络图片的能力.但这究竟是怎么做到的呢?看完这篇文章就明白了. 前言 这篇我们会介绍 AFNetworking 中的3个UIKit中的分类.UIAct ...

  7. AFNetworking 3.0 源码解读(九)之 AFNetworkActivityIndicatorManager

    让我们的APP像艺术品一样优雅,开发工程师更像是一名匠人,不仅需要精湛的技艺,而且要有一颗匠心. 前言 AFNetworkActivityIndicatorManager 是对状态栏中网络激活那个小控 ...

  8. AFNetworking 3.0 源码解读(一)之 AFNetworkReachabilityManager

    做ios开发,AFNetworking 这个网络框架肯定都非常熟悉,也许我们平时只使用了它的部分功能,而且我们对它的实现原理并不是很清楚,就好像总是有一团迷雾在眼前一样. 接下来我们就非常详细的来读一 ...

  9. AFNetworking 3.0 源码解读(三)之 AFURLRequestSerialization

    这篇就讲到了跟请求相关的类了 关于AFNetworking 3.0 源码解读 的文章篇幅都会很长,因为不仅仅要把代码进行详细的的解释,还会大概讲解和代码相关的知识点. 上半篇: URI编码的知识 关于 ...

随机推荐

  1. 树莓派笔记之使用netselect选择最快Raspbian软件源

    背景: 之前在葉難大大的部落格里看到有讲可以使用netselect查找最快软件源,今天正好看到, 特此记下来,因为之前一直使用中国科学技术大学的源,结果发现不是我这里最快的. 注意: 以下仅对Rasp ...

  2. 10月28日PHP基础知识测试题

    本试题共40道选择题,10道判断题,考试时间1个半小时 一:选择题(单项选择,每题2分): 1. LAMP具体结构不包含下面哪种(A) A:Windows系统 B:Apache服务器 C:MySQL数 ...

  3. thinkphp分页二,分装到funciton.php

    function.php代码 <?php /* 全局分页 * $table 数据表名 * $order 排序 * $pagesize 每页显示N个 * $where 查询条件 * $rollPp ...

  4. C# 4.0 之线程安全集合篇

    资料:http://www.cnblogs.com/chengxiaohui/articles/5672768.html

  5. 【Unity3D】利用Shader以及更改Mesh实现2D游戏的动态阴影效果

    最近看到一个非常有趣的益智小游戏,是一个盗贼进入房子偷东西的, 其实这种游戏市面上已经很多了,吸引我的是那个类似手电筒的效果, 主角走到哪里,光就到哪里,被挡住的地方还有阴影.有点类似策略游戏里的战争 ...

  6. jQuery入门(3)事件与事件对象

    jQuery入门(1)jQuery中万能的选择器 jQuery入门(2)使用jQuery操作元素的属性与样式 jQuery入门(3)事件与事件对象 jQuery入门(4)jQuery中的Ajax()应 ...

  7. ReactiveCocoa源码拆分解析(三)

    (整个关于ReactiveCocoa的代码工程可以在https://github.com/qianhongqiang/QHQReactive下载) 这一章节主要讨论信号的“冷”与“热” 在RAC的世界 ...

  8. 03OC的类的补充

    上一章我们介绍了类的定义,以及类的里面如何定义成员变量,如何定义方法等等. 一.self关键字 1.在C#中有关键字this表示当前对象,其实在OC中也有类似的关键字self,只是self关键字不仅表 ...

  9. centos 6.5 6.6 6.7安装gitlab教程(社区版)

    简单的说安装gitlab就两种办法主要介绍第一种:官网推荐的方法: 1.新建yum源 新建 /etc/yum.repos.d/gitlab-ce.repo,内容为 [gitlab-ce] name=g ...

  10. C#实现K-MEDOIDS聚类算法

    1.任意选取K个对象作为初始聚类中心(O1,O2,…Oi…Ok). 2)将余下的对象分到各个类中去(该对象与哪一个聚类中心最近就被分配到哪一个聚类簇中): 3)对于每个类(Oi)中,顺序选取一个Or, ...