代码

package com.dianping.cat.message.internal;

import com.dianping.cat.Cat;
import com.dianping.cat.message.ForkedTransaction;
import com.dianping.cat.message.Message;
import com.dianping.cat.message.Transaction;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.unidal.helper.Threads; import java.io.File;
import java.util.concurrent.TimeUnit; public class MultiThreadingTest {
@After
public void after() {
} @Before
public void before() {
Cat.initialize(new File("/data/appdatas/cat/client.xml"));
} @Test
public void testForkedTransaction() throws Exception {
Transaction t = Cat.newTransaction("ForkedRoot", "Root");
ForkedTransaction t1 = Cat.newForkedTransaction("ForkedChild", "Child1"); //在当前消息树中埋点桥接节点
Threads.forGroup().start(new TimedThread(t1, 100)); //与子线程共享这个对象
TimeUnit.MILLISECONDS.sleep(200);
t.setStatus(Message.SUCCESS);
t.complete();
} static class TimedThread extends Thread {
private ForkedTransaction m_transaction; private int m_timeout; public TimedThread(ForkedTransaction t, int timeout) {
m_transaction = t;
m_timeout = timeout;
} @Override
public void run() {
m_transaction.fork();
try {
TimeUnit.MILLISECONDS.sleep(m_timeout);
Cat.logEvent("TimedThread", "Timeout." + m_timeout);
m_transaction.setStatus(Message.SUCCESS);
} catch (Exception e) {
Cat.logError(e);
m_transaction.setStatus(e);
} finally {
m_transaction.complete();
}
}
}
}

模型图

代码和流程分析

new一个ForkT在干嘛?
1.初始化当前线程的消息树根节点消息Id
2.创建子线程中的事务,并设置自己的根节点和父节点的消息Id
3.在消息树的当前节点加入一个额外的event节点,并且把子线程的msgId记录下来

linkasRunAway的具体逻辑

子线程的fork在干嘛?

1.在子线程中初始化本线程的消息树

2. 把forkT的消息id作为子线程的根节点消息id,这样就可以通过runway event节点找到子线程的消息树

Cat 跨线程之 ForkedTransaction 用法和原理分析的更多相关文章

  1. Cat 跨线程之 TaggedTransaction 用法和原理分析

    代码 package com.dianping.cat.message.internal; import com.dianping.cat.Cat; import com.dianping.cat.m ...

  2. [1.6W字] 浏览器跨域请求限制的详细原理分析&寻找一种最简单的方式实现XHR跨域(9种方法, 附大招可以纯前端实现跨域!)

    Title/ 浏览器跨域(CrossOrigin)请求的原理, 以及解决方案详细指南 #flight.Archives011 序: 最近看到又有一波新的创作活动了, 官方给出的话题中有一个" ...

  3. MariaDB/MySQL备份和恢复(三):xtrabackup用法和原理详述

    本文目录: 1.安装xtrabackup 2.备份锁 3.xtrabackup备份原理说明 3.1 备份过程(backup阶段) 3.2 准备过程(preparing阶段) 3.3 恢复过程(copy ...

  4. Java线程之 InterruptedException 异常

    Java线程之 InterruptedException 异常   当一个方法后面声明可能会抛出InterruptedException 异常时,说明该方法是可能会花一点时间,但是可以取消的方法. 抛 ...

  5. JAVA多线程之volatile 与 synchronized 的比较

    一,volatile关键字的可见性 要想理解volatile关键字,得先了解下JAVA的内存模型,Java内存模型的抽象示意图如下: 从图中可以看出: ①每个线程都有一个自己的本地内存空间--线程栈空 ...

  6. WebAPI调用笔记 ASP.NET CORE 学习之自定义异常处理 MySQL数据库查询优化建议 .NET操作XML文件之泛型集合的序列化与反序列化 Asp.Net Core 轻松学-多线程之Task快速上手 Asp.Net Core 轻松学-多线程之Task(补充)

    WebAPI调用笔记   前言 即时通信项目中初次调用OA接口遇到了一些问题,因为本人从业后几乎一直做CS端项目,一个简单的WebAPI调用居然浪费了不少时间,特此记录. 接口描述 首先说明一下,基于 ...

  7. Java基础-进程与线程之Thread类详解

    Java基础-进程与线程之Thread类详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.进程与线程的区别 简而言之:一个程序运行后至少有一个进程,一个进程中可以包含多个线程 ...

  8. Android 多线程之IntentService 完全详解

    关联文章: Android 多线程之HandlerThread 完全详解 Android 多线程之IntentService 完全详解 android多线程-AsyncTask之工作原理深入解析(上) ...

  9. Android 多线程之HandlerThread 完全详解

    关联文章: Android 多线程之HandlerThread 完全详解 Android 多线程之IntentService 完全详解 android多线程-AsyncTask之工作原理深入解析(上) ...

随机推荐

  1. Abp后台工作者类使用hangfire

    一.Abp中的后台工作及后台工作者类 请阅读这篇文章 二 .Abp官方实现的缺点 Abp官方实现方式很简单,也很容易上手,但缺点是工作者类依赖了具体的基类(PeriodicBackgroundWork ...

  2. C#Dictionary键值对取值用法

    必须包含名空间System.Collection.Generic     Dictionary里面的每一个元素都是一个键值对(由二个元素组成:键和值)     键必须是唯一的,而值不需要唯一的     ...

  3. 12. ZooKeeper配额和认证

    ZooKeeper具有与其数据模型相关的可配置配额(quota). 可以设置znode上的配额限制和存储的数据量.如果ZooKeeper命名空间中的一个子树超出与其关联的配额,ZooKeeper会在日 ...

  4. linux网络、性能相关命令

    netstat -tunpl #查看进程列表 top #查看系统资源统计 服务器速度测试 ping 123.57.92.9 -t 每一个被发送出的IP信息包都有一个TTL域,该域被设置为一个较高的数值 ...

  5. EntityFramework For Mysql 动态切换数据源

    1.简介 在工作中遇到一个问题.项目有三个数据库(三个数据库表结构一样),用户可以选择使用哪个数据库.其实就是动态切换数据库连接. 2.EntityFramework For Mysql 先来简单的介 ...

  6. Python入门 - 生成随机数

    生成随机数是编程中经常用到的功能,下面讲几种常用的随机函数randint,uniform,  randrange: 一.生成随机整数 randint import random a = random. ...

  7. js监听浏览器离开页面操作

    序言 大家是否经常遇到在关闭网页的时候,会看到一个确定是否离开当前页面的提示框?想一些在线测试系统.信息录入系统等就经常会有这一些提示,避免用户有意或者无意中关掉了页面,导致数据丢失.这里面的实现过程 ...

  8. 服务器获取浏览器发送请求中的cookies,选取自己需要的cookie

    String cookieName = “userID”; // 设置自己需要的cookie名 Cookie cookies[] = request.getCookies(); // 获取请求中的所有 ...

  9. [置顶] spring集成mina 实现消息推送以及转发

    spring集成mina: 在学习mina这块时,在网上找了很多资料,只有一些demo,只能实现客户端向服务端发送消息.建立长连接之类.但是实际上在项目中,并不简单实现这些,还有业务逻辑之类的处理以及 ...

  10. Sagit.Framework For IOS 开发框架入门开发教程1:框架下载与环境配置

    背景: 前天开源了框架:开源:Sagit.Framework For IOS 开发框架 所以注定要追补一套开发教程了,所以尽量抽空了!!! 步骤 1:下载框架源码 GitHub:https://git ...