Apache Struts 2 Documentation > Home > Guides > Core Developers Guide > Profiling |
Profiling software looks for bottlenecks in program execution. In addition to the profiling services provided by IDEs and standalone profilers, the framework provides its own internal support for profiling.
Struts2 profiling aspects involves the following :-
To enable profiling, first make sure that the profiling interceptor is applied to your action, like:
<action ... > ... <interceptor-ref name="profiling"> <param name="profilingKey">profiling</param> </interceptor-ref> ... </action>
Then enable profiling using one of the following methods:
-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)
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.
http://host:port/context/namespace/someAction.action?profiling=true
Set the profilingKey attribute of the profiling interceptor to the desired name:
<action ... > ... <interceptor-ref name="profiling"> <param name="profilingKey">profiling</param> </interceptor-ref> ... </action>
Profiling activation through a parameter requires struts.devMode to be true. |
One could filter out the profile logging by having a System property as follows:
-Dxwork.profile.mintime=10000
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.
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 }
String result = UtilTimerStack.profile("purchaseItem: ", new UtilTimerStack.ProfilingBlock<String>() { 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.