com.opensymphony.xwork2.util.profiling

## Class UtilTimerStack

- java.lang.Object
- - com.opensymphony.xwork2.util.profiling.UtilTimerStack

- Deprecated.
  will be dropped with next major release (2.6)

      @Deprecated
      public class UtilTimerStack
      extends Object

  A timer stack.

  Struts2 profiling aspects involves the following:

  - ActionContextCleanUp
  - FreemarkerPageFilter
  - DispatcherFilter
    - Dispatcher
      - creation of DefaultActionProxy
        - creation of DefaultActionInvocation
          - creation of Action
      - execution of DefaultActionProxy
        - invocation of DefaultActionInvocation
          - invocation of Interceptors
          - invocation of Action
          - invocation of PreResultListener
          - invocation of Result

  XWork2 profiling aspects involves the following:

  - creation of DefaultActionProxy
    - creation of DefaultActionInvocation
  - creation of Action
  - execution of DefaultActionProxy
    - invocation of DefaultActionInvocation
      - invocation of Interceptors
      - invocation of Action
      - invocation of PreResultListener
      - invocation of Result

  Activating / Deactivating of the profiling feature could be done through:

  System properties:

        -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)

  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:

  - Profiling interceptor in interceptor stack
  - dev mode on (struts.devMode=true in struts.properties)

  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

  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
          }

  or

         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.

- - ### Nested Class Summary

    Nested Classes
    Modifier and Type | Class and Description
    --- | ---
    `static interface` | `UtilTimerStack.ProfilingBlock<T>` Deprecated. A callback interface where code subjected to profile is to be executed.

  - ### Field Summary

    Fields
    Modifier and Type | Field and Description
    --- | ---
    `static String` | `ACTIVATE_PROPERTY` Deprecated. System property that controls whether this timer should be used or not.
    `protected static ThreadLocal<ProfilingTimerBean>` | `current` Deprecated.
    `static String` | `MIN_TIME` Deprecated. System property that controls the min time, that if exceeded will cause a log (at INFO level) to be created.

  - ### Constructor Summary

    Constructors
    Constructor and Description
    `UtilTimerStack()` Deprecated.

  - ### Method Summary

    Methods
    Modifier and Type | Method and Description
    --- | ---
    `static boolean` | `isActive()` Deprecated. 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)` Deprecated. End a performance profiling with the `name` given.
    `static <T> T` | `profile(String name, UtilTimerStack.ProfilingBlock<T> block)` Deprecated. 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)` Deprecated. Create and start a performance profiling with the `name` given.
    `static void` | `setActive(boolean active)` Deprecated.

    - ### Methods inherited from class java.lang.Object

      `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

- - ### Field Detail

    - #### current

          protected static ThreadLocal<ProfilingTimerBean> current

      Deprecated.

    - #### ACTIVATE_PROPERTY

          public static final String ACTIVATE_PROPERTY

      Deprecated.
      System property that controls whether this timer should be used or not. Set to "true" activates the timer. Set to "false" to deactivate.
      See Also:
        Constant Field Values

    - #### MIN_TIME

          public static final String MIN_TIME

      Deprecated.
      System property that controls the min time, that if exceeded will cause a log (at INFO level) to be created.
      See Also:
        Constant Field Values

  - ### Constructor Detail

    - #### UtilTimerStack

          public UtilTimerStack()

      Deprecated.

  - ### Method Detail

    - #### push

          public static void push(String name)

      Deprecated.
      Create and start a performance profiling with the `name` given. Deal with profile hierarchy automatically, so caller don't have to be concern about it.
      Parameters:
        `name` - profile name

    - #### pop

          public static void pop(String name)

      Deprecated.
      End a performance profiling with the `name` given. Deal with profile hierarchy automatically, so caller don't have to be concern about it.
      Parameters:
        `name` - profile name

    - #### isActive

          public static boolean isActive()

      Deprecated.
      Determine if profiling is being activated, by searching for a system property 'xwork.profile.activate', default to false (profiling is off).
      Returns:
        `true`, if active, `false` otherwise.

    - #### setActive

          public static void setActive(boolean active)

      Deprecated.
      Parameters:
        `active` - Turn profiling on or off.

    - #### profile

          public static <T> T profile(String name,
                      UtilTimerStack.ProfilingBlock<T> block)
                           throws Exception

      Deprecated.

      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 ... finally ... block.

      Example of usage:

                   // we need a returning result
             String result = UtilTimerStack.profile("purchaseItem: ",
                 new UtilTimerStack.ProfilingBlock<String>() {
                      public String doProfiling() {
                         getMyService().purchaseItem(....)
                         return "Ok";
                      }
                 });

      or

             // we don't need a returning result
             UtilTimerStack.profile("purchaseItem: ",
                 new UtilTimerStack.ProfilingBlock<String>() {
                      public String doProfiling() {
                         getMyService().purchaseItem(....)
                         return null;
                      }
                 });

      Type Parameters:
        `T` - any return value if there's one.
      Parameters:
        `name` - profile name
        `block` - code block subjected to profiling
      Returns:
        T
      Throws:
        `Exception` - in case of any errors

Copyright © 2000–2020 Apache Software Foundation. All rights reserved.