XWork2 supports build-in profiling.
Profiling aspects
XWork2 profiling aspects involves the following :-
- creation of DefaultActionProxy
- creation of DefaultActionInvocation
- execution of DefaultActionProxy
- invocation of DefaultActionInvocation
- invocation of Interceptors
- invocation of Action
- invocation of PreResultListener
- invocation of Result
Activating / Deactivating Profiling
Activating / Deactivating of the profiling feature could be done through:-
Through System property
-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)
Through 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.
Filtering profile information
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
Write profiling code
One could extend the profiling feature provided by Struts2 in their web application as well.
Using UtilTimerStack's push and pop
String logMessage = "Log message";
UtilTimerStack.push(logMessage);
try {
// do some code
}
finally {
UtilTimerStack.pop(logMessage); // this needs to be the same text as above
}
Using a UtilTimerStack's ProfileBlock template
String result = UtilTimerStack.profile("purchaseItem: ",
new UtilTimerStack.ProfilingBlock<String>() {
public String doProfiling() {
// do some code
return "Ok";
}
});
Profiling Log files
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.