先上controller配置 <!-- Controller方法调用规则定义 -->
    <bean id="paraMethodResolver"
        class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
        <property name="paramName" value="action"/>
        <property name="defaultMethodName" value="list"/>
    </bean>   <!-- 页面View层基本信息设定 -->
    <bean id="viewResolver" 
          class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass"
            value="org.springframework.web.servlet.view.JstlView"/>
        <!--<property name="prefix" value="/myjsp/"/>-->
        <property name="suffix" value=".jsp"/>
    </bean><!-- servlet映射列表,所有控制层Controller的servlet在这里定义 -->
    <bean id="wxUrlMapping"
          class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="wx.do">wxController</prop>
            </props>
        </property>
    </bean>
配置好以后,使用HttpRequester发送post请求
http://localhost:8080/wx.do?action=findGifts&aaa=111&bbb=222
发送请求后,进入wxController中的findGifts方法,同时传递参数aaa,bbb
问题来了,前几次请求,能够顺利进入controller的findGifts方法,多次请求后,却始终无法进入了,系统所有controller报废,没有一个能进入的其中wxController extends MultiActionController
方法gifts返回是这样写的PrintWriter out = null;
try{
response.setCharacterEncoding("UTF-8");
response.setContentType("text/plain");
out = response.getWriter();
out.print(GsonUtil.mapToJson(map));
out.flush();
out.close();
} catch (Exception e){
e.printStackTrace();
} finally{
if (out != null) {
out.close();
out = null;
}
}
研究一大晚上,始终不得其解,跟踪源码,发现在spring的MultiActionController中执行invokeNamedMethod方法时,卡在了
Object returnValue = method.invoke(this.delegate, params.toArray(new Object[params.size()]));
不报异常,不超时,什么错误都没有,到了这里就没有结果了。整个程序就停止了。tomcat没有挂掉,访问登录页面也可以,但是一旦调用接口,变又卡在这里。请教各位大神,此种问题应该从哪一方面下手去解决另外,非数据库问题,数据库是正常的。   tomcat重启后一切正常,接口接收处理几次请求后,问题马上出现。已经处理一天了。。求指导

解决方案 »

  1.   

    抓一下 jvm thread dump 看一下到底执行哪个方法卡住了
    ----------------------------
    多访问几次,等卡住了 赶紧 thread dump 抓取和分析 jvm thread dump 在网上搜索一下 有很多例子
      

  2.   

    你这种情况可能是死锁了。查看各线程状态
     如果在IED中,可以直接在debug视图中看各线程的状态;
    如果在运营环境中,需要用到命令
     jstack  -F <pid>
    jstack  是jdk的一个工具,在jdk的bin目录下,如果运营环境中没有jdk,可以复制上去,直接可用。建议保证jdk和jre版本一致(至少大版本一致)用如果大多线程都处于block状态,说明有问题,可能是有死锁,可能是JVM内存不够导致频繁的内存回收。如果有死锁,通过上面的jstack可以检测出来,最后会输出一行 “found 1 deadlock”
    检测内存是否频道回收
    同样使用jdk的工具
    jstat -gc <pid>   pid表示java进程编号
    其中输出几列数据,其中如果YGCT(Young GC times)、FGCT(Full GC times),正常YGCT远远大于FGCT,如果两个数字特别大,且FGCT增长速度较快(10秒一次都算很快),那么说明内存分配或利用有问题。可以参照另外几组数据来分析。
    以上,供参考
    如果是在调试环境中,用eclipse打断点
      

  3.   

    jstack -l PID > 文件名.stack 看一看有没有线程是BLOCK的状态
    jstat -gc `pgrep java` 3000  看一下内存回收情况,如果内存回收慢 也回收资源很少用jmap -dump:format=b,file=heap.bin <pid>看看内存增长在了哪里
      

  4.   

    select * from user
      

  5.   

    你好,我正在学习springMVC,下载的是spring-framework-5.0.2.RERLEASE版本。不过发现这里面已经没有MultiActionController类了。请问,是spring在新版本中移除这个类了吗?