zoukankan      html  css  js  c++  java
  • Struts2性能调优拦截器

    当我们在工作中需要实现某些小需求时,不妨先进行下简单的调研,看看正在使用的开源框架是否已经具备了我们需要的功能,这样就不用重复发明轮子了。

     下面以性能测试为例,看看如何调查Struts2框架是否具备这种功能。


    1.   struts-default.xml


    因为Struts2的许多核心功能都是基于内部拦截器来实现的,所以我们首先要看看它是否有性能调优相关的拦截器。这就需要查看strut2-core-2.3.1.2.jar中的默认配置文件struts-default.xml了。

    	<interceptor name="alias" class="com.opensymphony.xwork2.interceptor.AliasInterceptor"/>
                <interceptor name="autowiring" class="com.opensymphony.xwork2.spring.interceptor.ActionAutowiringInterceptor"/>
                <interceptor name="chain" class="com.opensymphony.xwork2.interceptor.ChainingInterceptor"/>
                <interceptor name="conversionError" class="org.apache.struts2.interceptor.StrutsConversionErrorInterceptor"/>
                <interceptor name="cookie" class="org.apache.struts2.interceptor.CookieInterceptor"/>
                <interceptor name="clearSession" class="org.apache.struts2.interceptor.ClearSessionInterceptor" />
                <interceptor name="createSession" class="org.apache.struts2.interceptor.CreateSessionInterceptor" />
                <interceptor name="debugging" class="org.apache.struts2.interceptor.debugging.DebuggingInterceptor" />
                <interceptor name="execAndWait" class="org.apache.struts2.interceptor.ExecuteAndWaitInterceptor"/>
                <interceptorname="exception" class="com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor"/>
                <interceptor name="fileUpload" class="org.apache.struts2.interceptor.FileUploadInterceptor"/>
                <interceptor name="i18n" class="com.opensymphony.xwork2.interceptor.I18nInterceptor"/>
                <interceptor name="logger" class="com.opensymphony.xwork2.interceptor.LoggingInterceptor"/>
                <interceptor name="modelDriven" class="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"/>
                <interceptor name="scopedModelDriven" class="com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor"/>
                <interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>
                <interceptor name="actionMappingParams" class="org.apache.struts2.interceptor.ActionMappingParametersInteceptor"/>
                <interceptor name="prepare" class="com.opensymphony.xwork2.interceptor.PrepareInterceptor"/>
                <interceptor name="staticParams" class="com.opensymphony.xwork2.interceptor.StaticParametersInterceptor"/>
                <interceptor name="scope" class="org.apache.struts2.interceptor.ScopeInterceptor"/>
                <interceptor name="servletConfig" class="org.apache.struts2.interceptor.ServletConfigInterceptor"/>
                <interceptor name="timer" class="com.opensymphony.xwork2.interceptor.TimerInterceptor"/>
                <interceptor name="token" class="org.apache.struts2.interceptor.TokenInterceptor"/>
                <interceptor name="tokenSession" class="org.apache.struts2.interceptor.TokenSessionStoreInterceptor"/>
                <interceptor name="validation" class="org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor"/>
                <interceptor name="workflow" class="com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor"/>
                <interceptor name="store" class="org.apache.struts2.interceptor.MessageStoreInterceptor" />
                <interceptor name="checkbox" class="org.apache.struts2.interceptor.CheckboxInterceptor" />
                <interceptor name="profiling" class="org.apache.struts2.interceptor.ProfilingActivationInterceptor" />
                <interceptor name="roles" class="org.apache.struts2.interceptor.RolesInterceptor" />
                <interceptor name="annotationWorkflow" class="com.opensymphony.xwork2.interceptor.annotations.AnnotationWorkflowInterceptor" />
               <interceptor name="multiselect" class="org.apache.struts2.interceptor.MultiselectInterceptor" />

    Struts2像个百宝箱一样内置了很多拦截器,可以看到profiling很可能就是符合我们需求的拦截器,那现在就打开源码一探究竟。

    2.   ProfilingActivationInterceptor


    org.apache.struts2.interceptor.ProfilingActivationInterceptor.java

    public class ProfilingActivationInterceptor extendsAbstractInterceptor {
     
        private String profilingKey = "profiling";
        private boolean devMode;
       
        @Inject(StrutsConstants.STRUTS_DEVMODE)
        public void setDevMode(String mode) {
            this.devMode = "true".equals(mode);
        }
     
        @Override
        public String intercept(ActionInvocationinvocation) throws Exception {
            if (devMode) {
                Object val =invocation.getInvocationContext().getParameters().get(profilingKey);
                if (val != null) {
                    String sval = (val instanceof String ?(String)val : ((String[])val)[0]);
                    boolean enable = "yes".equalsIgnoreCase(sval)|| "true".equalsIgnoreCase(sval);
                    UtilTimerStack.setActive(enable);
                    invocation.getInvocationContext().getParameters().remove(profilingKey);
                }
            }
            return invocation.invoke();
     
        }
     
    }

    从源码中可以看到,只要浏览器发过来的HTTP请求参数中包含profiling=true或者yes,性能拦截器就会开启Timer工具类,打印出Action的执行消耗时间。


    3.   struts.xml


    因为profiling拦截器没有包含到默认的defaultStack中,所以我们要先将它追加到我们自定义的拦截器栈中。

    <package name="ajax-default" extends="velocity-default">
            <result-types>
                <result-type name="json" class="org.apache.struts2.json.JSONResult"/>
            </result-types>
           
            <interceptors>
                <interceptor-stackname="ajaxInterceptorStack">
                <interceptor-refname="defaultStack" />
                <interceptor-ref name="profiling"/>
                </interceptor-stack>
            </interceptors>
           
            <default-interceptor-refname="ajaxInterceptorStack" />
           
            <global-results>
                <result name="comAjaxResult" type="json">
                    <param name="excludeNullProperties">true</param>
                    <param name="root">result</param>
                    <param name="ignoreHierarchy">false</param>
                </result>
            </global-results>
        </package>

    4.   userview.js


    现在就可以修改AJAX调用参数,追加上profiling参数就可以开始性能调优了。

    function searchAllUser(){
        jQuery.ajax({
            type:"post",
            url: "searchAllUser.action",
            processData:true,
            dataType:'json',
            data:jQuery("#userQueryForm").serialize() + "&profiling=yes",
            success:function(data) {
            if (data.status == 1) {
                 alert("创建成功");
                 generateTableFromJson("result", data.resultRows);
            } else {
                 alert("创建失败");
            }
            }
        });
    }

    5.   最终效果

    打印结果就是下面这样。除了总执行时间外,Action方法的执行时间和Result的渲染时间都会分别列出。


  • 相关阅读:
    [转载]Oracle Golden Gate
    git操作命令
    logger.error完整打印错误堆栈信息
    短网址算法
    YYYY-mm-dd HH:MM:SS大小写解释
    quarz时间配置
    Freemarket语法
    Java NIO:IO与NIO的区别
    idea常用到的命令
    linux 常用命令
  • 原文地址:https://www.cnblogs.com/xiaomaohai/p/6157791.html
Copyright © 2011-2022 走看看