RequestFactory 请求 (AutoBeanCodexImpl.doCoderFor) 永远不会完成并使用 100% cpu
Posted
技术标签:
【中文标题】RequestFactory 请求 (AutoBeanCodexImpl.doCoderFor) 永远不会完成并使用 100% cpu【英文标题】:RequestFactory request (AutoBeanCodexImpl.doCoderFor) never finish and use 100% cpu 【发布时间】:2012-09-13 09:52:38 【问题描述】:我们在 tomcat 上部署了一个 GWT 应用程序,使用几个小时后(2 个 QA 执行一般测试),java 进程开始使用所有 CPU,应用程序变慢。
我查看了 tomcat 管理器,发现有许多长时间运行的 HTTP 请求,它们都指向“/gwtRequest”,这是我们的 RequestFactory servlet。
之后我进行了线程转储,发现转储中的所有 RUNNABLE http 线程都指向“AutoBeanCodexImpl.doCoderFor()”
"http-8080-51" daemon prio=10 tid=0x00007f23d8b81800 nid=0x4981 runnable [0x00007f23d4285000] java.lang.Thread.State: RUNNABLE at java.util.HashMap.get(HashMap.java:303) at com.google.web.bindery.autobean.shared.impl.AutoBeanCodexImpl.doCoderFor(AutoBeanCodexImpl.java:519) at com.google.web.bindery.autobean.shared.impl.AbstractAutoBean.setProperty(AbstractAutoBean.java:276) at com.google.web.bindery.autobean.vm.impl.ProxyAutoBean.setProperty(ProxyAutoBean.java:253) at com.google.web.bindery.autobean.vm.impl.BeanPropertyContext.set(BeanPropertyContext.java:44) at com.google.web.bindery.requestfactory.server.Resolver$PropertyResolver.visitValueProperty(Resolver.java:155) at com.google.web.bindery.autobean.vm.impl.ProxyAutoBean.traverseProperties(ProxyAutoBean.java:289) at com.google.web.bindery.autobean.shared.impl.AbstractAutoBean.traverse(AbstractAutoBean.java:166) at com.google.web.bindery.autobean.shared.impl.AbstractAutoBean.accept(AbstractAutoBean.java:101) at com.google.web.bindery.requestfactory.server.Resolver.resolveClientValue(Resolver.java:414) at com.google.web.bindery.requestfactory.server.SimpleRequestProcessor.processInvocationMessages(SimpleRequestProcessor.java:493) at com.google.web.bindery.requestfactory.server.SimpleRequestProcessor.process(SimpleRequestProcessor.java:235) at com.google.web.bindery.requestfactory.server.SimpleRequestProcessor.process(SimpleRequestProcessor.java:137) at com.google.web.bindery.requestfactory.server.RequestFactoryServlet.doPost(RequestFactoryServlet.java:133)
谁能给我指出我应该看的地方?谢谢
【问题讨论】:
【参考方案1】:啊,哎哟!看起来我们正在使用静态 HashMap
没有任何同步!我相信这是因为 AutoBeans 最初设计为仅在浏览器中工作,它是单线程的。
这是fixed in trunk,应该会在几天后发布make it into 2.5.0-rc2。您可以跟踪the issue 的状态。
【讨论】:
请问一个傻问题,如果是同步问题,会不会导致死锁,在某些情况下还会导致死循环吗? 在***.com/questions/1003026/hashmap-concurrency-issue找到我的问题的答案以上是关于RequestFactory 请求 (AutoBeanCodexImpl.doCoderFor) 永远不会完成并使用 100% cpu的主要内容,如果未能解决你的问题,请参考以下文章
GWT-RPC 和 RequestFactory 是互斥的吗?
GWT requestfactory 验证外部服务器上的实体