关于UtilTimerStack类的使用--XWork2、Struts2内置性能诊断类
关于UtilTimerStack类的使用--XWork2、Struts2内置性能诊断类
一、UtilTimerStack做什么用的?
这个本来是Xwork2(Struts2的核心)的相关的工具类,可以用来测试一些逻辑操作所消耗的时间(以毫秒为单位),其本身使用一个
ArrayList作为存放ProfilingTimerBean的容器,而行为以Stack栈(后入先出)为主。在打印的时候支持缩进显示,显示相关的
调用关系。类ProfilingTimerBean主要是用来记录一些相关的信息,例如主要标识、开始时间、结束时间。
二、UtilTimerStack如何使用?
UtilTimerStack的调用方法不多且都为静态函数,但在调用之前必须先开启诊断功能,
主要有以下三种方法开启:
- 在启动时加入参数: -Dxwork.profile.activate=true
- 在使用前、或者静态代码区、或者Servlet的初始化、或者Filter的初始化 加入代码:
UtilTimerStack.setActivate(true);
或者 System.setProperty("xwork.profile.activate", "true");
或者 System.setProperty(UtilTimerStack.ACTIVATE_PROPERTY, "true");
- 也支持xml来定义相关拦截器(必须开启dev模式和加入Profiling拦截器):
<action ... >
...
<interceptor-ref name="profiling">
<param name="profilingKey">profiling</param>
</interceptor-ref>
...
</action>
再通过URL访问: http://host:port/context/namespace/someAction.action?profiling=true
或者通过代码加入请求参数: ActionContext.getContext().getParameters().put("profiling", "true);
指定超时打印功能,只有当运行时间超过时才会进行记录,开启方法:
- 在启动时加入参数: -Dxwork.profile.mintime=1000
- 或者代码加入:System.setProperty(UtilTimerStack.MIN_TIME, "" + 1000);
例子代码:
- public static void main(String[] args) throws InterruptedException {
- String name = "test used time:";
- UtilTimerStack.setActive(true); //开启诊断功能
- System.setProperty(UtilTimerStack.MIN_TIME, "" + 1000); //设置最小的超时记录时间
- UtilTimerStack.push(name); //顶节点的记录Bean
- subMethod(0);
- UtilTimerStack.pop(name);//对应的出栈操作,名称与入栈时相同
- }
- public static void subMethod(int i) throws InterruptedException{
- System.out.println(i + "");
- UtilTimerStack.push(i + " times");
- if(i<3) subMethod(i+1); //递归调用,会产生缩进,最后调用i=3时不足1000,不记录
- Thread.sleep(i * 300);
- UtilTimerStack.pop(i + " times");
- }
代码输出:
0
1
2
3
2010-3-21 16:16:52 com.opensymphony.xwork2.util.logging.commons.CommonsLogger info
信息: [1828ms] - test used time:
[1828ms] - 0 times
[1828ms] - 1 times
[1516ms] - 2 times
三、UtilTimerStack内部机制?
ProfilingTimerBean类结构
主要成员:
List<ProfilingTimerBean> children;//记录子节点为,打印时需要
ProfilingTimerBean parent = null;//记录父节点,顶点的父节点为null
String resource;//主要标识,名称
long startTime;//开始时间
long totalTime;//结束时间
UtilTimerStack的压栈(push)动作:
- public static void push(String name)
- {
- if (!isActive()) //判断是否开启诊断功能
- return;
- //创建新的记录Bean,并用setStartTime方法开始记录
- ProfilingTimerBean newTimer = new ProfilingTimerBean(name);
- newTimer.setStartTime();
- //判断如果有父节点,则添加到父节点的Child中.
- ProfilingTimerBean currentTimer = (ProfilingTimerBean) current.get();
- if (currentTimer != null)
- {
- currentTimer.addChild(newTimer);
- }
- //再把新建的节点设置为当前的线程的局部变量current中.
- current.set(newTimer);
- }
UtilTimerStack的出栈(pop)动作:
- public static void pop(String name)
- {
- if (!isActive())
- return;
- //获取当前线程的变量current.get()返回顶部记录Bean
- ProfilingTimerBean currentTimer = (ProfilingTimerBean) current.get();
- //if the timers are matched up with each other (ie push("a"); pop("a"));
- //测试出栈的记录Bean是否与要求的对应,如果不对应则log下错误,并打印栈里的记录Bean信息
- //如果与要求的标识对应,则把父节点设置为当前节点.
- if (currentTimer != null && name != null && name.equals(currentTimer.getResource()))
- {
- currentTimer.setEndTime();
- ProfilingTimerBean parent = currentTimer.getParent();
- //如果当前节点为根节点,则开始打印这个栈里面的记录Bean信息
- if (parent == null)
- {
- printTimes(currentTimer);
- //清理当前的线程局部变量,防止一些容器使用线程池的方式处理请求.
- current.set(null);
- }
- else
- {
- //设置父节点为当前节点.
- current.set(parent);
- }
- }
- else
- {
- //当出栈的顺序不对称时,把剩下的都打印出来
- if (currentTimer != null)
- {
- printTimes(currentTimer);
- current.set(null);
- LOG.warn("Unmatched Timer. Was expecting " + currentTimer.getResource() + ", instead got " + name);
- }
- }
- }
关于UtilTimerStack类的使用--XWork2、Struts2内置性能诊断类的更多相关文章
- struts2内置拦截器和自定义拦截器详解(附源码)
一.Struts2内置拦截器 Struts2中内置类许多的拦截器,它们提供了许多Struts2的核心功能和可选的高级特 性.这些内置的拦截器在struts-default.xml中配置.只有配置了拦截 ...
- 扩展PHP内置的异常处理类
在try代码块中,需要使用throw语句抛出一个异常对象,才能跳到转到catch代码块中执行,并在catch代码块中捕获并使用这个异常类的对象.虽然在PHP中提供的内置异常处理类Exception,已 ...
- day28 面向对象:反射,内置函数,类的内置方法
面向对象进阶博客地址链接: http://www.cnblogs.com/Eva-J/articles/7351812.html 复习昨日内容: # 包 # 开发规范 # # hashlib # 登录 ...
- 2018.11.20 Struts2中对结果处理方式分析&struts2内置的方式底层源码剖析
介绍一下struts2内置帮我们封装好的处理结果方式也就是底层源码分析 这是我们的jar包里面找的位置目录 打开往下拉看到result-type节点 name那一列就是我们的type类型取值 上一篇博 ...
- Struts2内置校验器——完整实例代码
一.校验器的配置风格 1.字段校验器: <field name="被校验的字段"> <field-validator type="校验器名"& ...
- 洗礼灵魂,修炼python(42)--巩固篇—type内置函数与类的千丝万缕关系
type函数的隐藏属性 相信大家都知道内置函数type是用来查看对象的数据类型的.例: 那比如我对int类查看类型呢? 有朋友会说,int是内置类啊,用自定义的应该不会这样,我们自定义一个类呢? 还是 ...
- python基础之反射内置方法元类
补充内置函数 isinstance(obj,Foo) # 判断obj是不是foo的实例 issubclass() # 判断一个类是不是另一个类的子类 反射 什么是反射? 通过字符串来操作 ...
- python类详细说明、常用内置方法和self的作用
一.类的定义 在Python中,一切皆对象,即便是类本身,也是一种type类型的特殊对象. class Person: def __init__(self, name, age): self.name ...
- python类与对象-如何派生内置不可变类型并修其改实例化行为
如何派生内置不可变类型并修其改实例化行为 问题举例 自定义一种新类型的元组,对传入的可迭代对象,我们只保留 其中int类型且值大于0的元素,例如 IntTuple([1, -1, 'abc', 6, ...
随机推荐
- 《TCP/IP作品详细解释2:达到》注意事项--ARP:地址解析协议
Net/3于ARP和实施密切与路由表相关联的,下图显示了我们的叙述性说明ARP使用样品. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvVE9ERDkxMQ ...
- AsyncTask測试多任务
本人进行过模拟測试,发现AsyncTask并不适合多任务,以及长期的异步任务,由于每次仅仅能执行一个AsyncTask,假设执行多个其他任务将会等待 以下通过一个代码样例和日志打印得到证实. 以下扩展 ...
- Nancy
Nancy Nancy 是一个轻量级的,简单粗暴的framework用来构建基于HTTP的各种服务,兼容.Net和Mono.Nancy的整套设计理念是基于"super-duper-happy ...
- 《web全栈工程师的自我修养》阅读笔记
在买之前以为这本书是教你怎么去做一个web全栈工程师,以及介绍需要掌握的哪些技术的书,然而看的过程中才发现,是一本方法论的书.读起来的感觉有点像红衣教主的<我的互联网方法论>,以一些自己的 ...
- WWDC 2014 Session 205/217 Extension 注意事项
基于阅读下面的内容205和217的PDF做笔记.没有深入研究. 205 Creating Extensions for iOS and OS X, Part 1 217 Creating Extens ...
- 一个轻量级rest服务器
RestServer直接发布数据库为json格式提供方法 RestSerRestServer直接发布数据库为json格式 支持MySQL,SqlServer,Oracle直接发布为Rest服务, 返回 ...
- HDU ACM 1290 献给杭电五十周年校庆的礼物
解析: 1.n条直线把平面切割成的区域数为: f(n)=f(n-1)+n=n(n+1)/2+1; 2.把空间切割为最多区域数的时候,第n个平面与前(n-1)个平面相交.且无三面共线,因此该平面与前(n ...
- Code Review中的几个提示
原文:http://coolshell.cn/?p=1302 酷壳 Code Review中的几个提示 陈皓 Code Review应该是软件project最最有价值的一个活动,之前,本站发表过&l ...
- Shell 文字 顶替tomcat星团war包裹
执行前server造成免费ssh登陆. 修改配置文件不是太大 您可以覆盖原有的配置 profile 简介 bak=/home/wsm/bak webapps=/home/wsm/webapps/WSM ...
- backup mysql for xtrabackup with xbstream and lz4
极品暂时mysql加入一个实例,采用xtrabackup最简单的速度. 在现有数据节点上: /home/work/app/xtrabackup-2.2.3/innobackupex --ibbacku ...