public class UtilTimerStack extends Object
-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.
| Modifier and Type | Class and Description |
|---|---|
static interface |
UtilTimerStack.ProfilingBlock<T>
A callback interface where code subjected to profile is to be executed.
|
| Modifier and Type | Field and Description |
|---|---|
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 and Description |
|---|
UtilTimerStack() |
| Modifier and Type | Method and Description |
|---|---|
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 <T> T |
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.
|
protected static ThreadLocal<ProfilingTimerBean> current
public static final String ACTIVATE_PROPERTY
public static final String MIN_TIME
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 profilingExceptionCopyright © 2000-2013 Apache Software Foundation. All Rights Reserved.