Save This Page
Home » xwork-2.1.1-src » com.opensymphony.xwork2.util.profiling » [javadoc | source]
com.opensymphony.xwork2.util.profiling
public class: UtilTimerStack [javadoc | source]
java.lang.Object
   com.opensymphony.xwork2.util.profiling.UtilTimerStack
A timer stack.

Struts2 profiling aspects involves the following :-

XWork2 profiling aspects involves the following :- Activating / Deactivating of the profiling feature could be done through:-

System properties:-



-Dxwork.profile.activate=true


This could be done in the container startup script eg. CATALINA_OPTS in catalina.sh (tomcat) or using "java -Dxwork.profile.activate=true -jar start.jar" (jetty)

Code :-



UtilTimerStack.setActivate(true);

// or

System.setProperty("xwork.profile.activate", "true");

// or

System.setProperty(UtilTimerStack.ACTIVATE_PROPERTY, "true");


This could be done in a static block, in a Spring bean with lazy-init="false", in a Servlet with init-on-startup as some numeric value, in a Filter or Listener's init method etc.

Parameter:-



<action ... >
...
<interceptor-ref name="profiling">
<param name="profilingKey">profiling</param>
</interceptor-ref>
...
</action>

or

<action .... >
...
<interceptor-ref name="profiling" />
...
</action>

through url

http://host:port/context/namespace/someAction.action?profiling=true

through code

ActionContext.getContext().getParameters().put("profiling", "true);


To use profiling activation through parameter, one will need to pass in through the 'profiling' parameter (which is the default) and could be changed through the param tag in the interceptor-ref.

Warning:

Profiling activation through a parameter requires the following:

One could filter out the profile logging by having a System property as follows. With this 'xwork.profile.mintime' property, one could only log profile information when its execution time exceed those specified in 'xwork.profile.mintime' system property. If no such property is specified, it will be assumed to be 0, hence all profile information will be logged.



-Dxwork.profile.mintime=10000


One could extend the profiling feature provided by Struts2 in their web application as well.


String logMessage = "Log message";
UtilTimerStack.push(logMessage);
try {
// do some code
}
finally {
UtilTimerStack.pop(logMessage); // this needs to be the same text as above
}


or


String result = UtilTimerStack.profile("purchaseItem: ",
new UtilTimerStack.ProfilingBlock() {
public String doProfiling() {
// do some code
return "Ok";
}
});


Profiled result is logged using commons-logging under the logger named 'com.opensymphony.xwork2.util.profiling.UtilTimerStack'. Depending on the underlying logging implementation say if it is Log4j, one could direct the log to appear in a different file, being emailed to someone or have it stored in the db.
Nested Class Summary:
public static interface  UtilTimerStack.ProfilingBlock  A callback interface where code subjected to profile is to be executed. This eliminates the need of coding boiler code that does pushing (UtilTimerBean.push(...)) and poping (UtilTimerBean.pop(...)) in a try ... finally ... block. 
Field Summary
protected static  ThreadLocal current     
public static final  String ACTIVATE_PROPERTY    System property that controls whether this timer should be used or not. Set to "true" activates the timer. Set to "false" to disactivate. 
public static final  String MIN_TIME    System property that controls the min time, that if exceeded will cause a log (at INFO level) to be created. 
Method from com.opensymphony.xwork2.util.profiling.UtilTimerStack Summary:
isActive,   pop,   profile,   push,   setActive
Methods from java.lang.Object:
equals,   getClass,   hashCode,   notify,   notifyAll,   toString,   wait,   wait,   wait
Method from com.opensymphony.xwork2.util.profiling.UtilTimerStack Detail:
 public static boolean isActive() 
    Determine if profiling is being activated, by searching for a system property 'xwork.profile.activate', default to false (profiling is off).
 public static  void pop(String name) 
    End a preformance profiling with the name given. Deal with profile hierarchy automatically, so caller don't have to be concern about it.
 public static T profile(String name,
    UtilTimerStack.ProfilingBlock block) throws Exception 
    A convenience method that allows block of code subjected to profiling to be executed and avoid the need of coding boiler code that does pushing (UtilTimeBean.push(...)) and poping (UtilTimerBean.pop(...)) in a try ... finally ... block.

    Example of usage:

    // we need a returning result
    String result = UtilTimerStack.profile("purchaseItem: ",
    new UtilTimerStack.ProfilingBlock() {
    public String doProfiling() {
    getMyService().purchaseItem(....)
    return "Ok";
    }
    });
    
    or
    // we don't need a returning result
    UtilTimerStack.profile("purchaseItem: ",
    new UtilTimerStack.ProfilingBlock() {
    public String doProfiling() {
    getMyService().purchaseItem(....)
    return null;
    }
    });
    
 public static  void push(String name) 
    Create and start a performance profiling with the name given. Deal with profile hierarchy automatically, so caller don't have to be concern about it.
 public static  void setActive(boolean active) 
    Turn profiling on or off.