|
||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Objectcom.opensymphony.xwork2.util.profiling.UtilTimerStack
public class UtilTimerStack
A timer stack.
Struts2 profiling aspects involves the following :--Dxwork.profile.activate=trueThis 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:
-Dxwork.profile.mintime=10000One 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.ProfilingBlockProfiled 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.() { public String doProfiling() { // do some code return "Ok"; } });
Nested Class Summary | |
---|---|
static interface |
UtilTimerStack.ProfilingBlock<T>
A callback interface where code subjected to profile is to be executed. |
Field Summary | |
---|---|
static String |
ACTIVATE_PROPERTY
System property that controls whether this timer should be used or not. |
protected static ThreadLocal<ProfilingTimerBean> |
current
|
private static Logger |
LOG
|
static String |
MIN_TIME
System property that controls the min time, that if exceeded will cause a log (at INFO level) to be created. |
Constructor Summary | |
---|---|
UtilTimerStack()
|
Method Summary | ||
---|---|---|
private static long |
getMinTime()
Get the min time for this profiling, it searches for a System property 'xwork.profile.mintime' and default to 0. |
|
static boolean |
isActive()
Determine if profiling is being activated, by searching for a system property 'xwork.profile.activate', default to false (profiling is off). |
|
static void |
pop(String name)
End a preformance profiling with the name given. |
|
private static void |
printTimes(ProfilingTimerBean currentTimer)
Do a log (at INFO level) of the time taken for this particular profiling. |
|
static
|
profile(String name,
UtilTimerStack.ProfilingBlock<T> block)
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 ... |
|
static void |
push(String name)
Create and start a performance profiling with the name given. |
|
static void |
setActive(boolean active)
Turn profiling on or off. |
Methods inherited from class java.lang.Object |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
Field Detail |
---|
protected static ThreadLocal<ProfilingTimerBean> current
public static final String ACTIVATE_PROPERTY
public static final String MIN_TIME
private static final Logger LOG
Constructor Detail |
---|
public UtilTimerStack()
Method Detail |
---|
public static void push(String name)
name
given. Deal with
profile hierarchy automatically, so caller don't have to be concern about it.
name
- profile namepublic static void pop(String name)
name
given. Deal with
profile hierarchy automatically, so caller don't have to be concern about it.
name
- profile nameprivate static void printTimes(ProfilingTimerBean currentTimer)
currentTimer
- profiling timer beanprivate static long getMinTime()
public static boolean isActive()
public static void setActive(boolean active)
active
- public static <T> T profile(String name, UtilTimerStack.ProfilingBlock<T> block) throws Exception
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.ProfilingBlockor() { public String doProfiling() { getMyService().purchaseItem(....) return "Ok"; } });
// we don't need a returning result UtilTimerStack.profile("purchaseItem: ", new UtilTimerStack.ProfilingBlock() { public String doProfiling() { getMyService().purchaseItem(....) return null; } });
T
- any return value if there's one.name
- profile nameblock
- code block subjected to profiling
Exception
|
||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |