|
||||||||||
| 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);
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.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 | |
|---|---|
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
|
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 | ||
|---|---|---|
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. |
|
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
| 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 namepublic 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.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;
}
});
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 | |||||||||