很久未发过贴了,spring mvc 使用MultiActionController 遇见相当奇怪的问题,维护一个坚持了10年的老项目。。。

Zh_java_2009 2017-02-21 03:17:54
先上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重启后一切正常,接口接收处理几次请求后,问题马上出现。已经处理一天了。。求指导
...全文
945 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
初见_冰 2018-01-27
  • 打赏
  • 举报
回复
考虑死锁情况
baidu_27798993 2018-01-27
  • 打赏
  • 举报
回复
你好,我正在学习springMVC,下载的是spring-framework-5.0.2.RERLEASE版本。不过发现这里面已经没有MultiActionController类了。请问,是spring在新版本中移除这个类了吗?
Yu鱼坤 2017-07-27
  • 打赏
  • 举报
回复
select * from user
jiajing1990_ 2017-02-22
  • 打赏
  • 举报
回复
jstack -l PID > 文件名.stack 看一看有没有线程是BLOCK的状态 jstat -gc `pgrep java` 3000 看一下内存回收情况,如果内存回收慢 也回收资源很少用jmap -dump:format=b,file=heap.bin <pid>看看内存增长在了哪里
yql1986 2017-02-21
  • 打赏
  • 举报
回复
抓一下 jvm thread dump 看一下到底执行哪个方法卡住了 ---------------------------- 多访问几次,等卡住了 赶紧 thread dump 抓取和分析 jvm thread dump 在网上搜索一下 有很多例子
Zh_java_2009 2017-02-21
  • 打赏
  • 举报
回复
手动顶贴
oO临时工Oo 2017-02-21
  • 打赏
  • 举报
回复
你这种情况可能是死锁了。 查看各线程状态  如果在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打断点

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧