Запрос RequestFactory (AutoBeanCodexImpl.doCoderFor) никогда не завершается и использует 100% ЦП

У нас есть приложение GWT, развернутое на tomcat, после нескольких часов использования (2 QAs выполняют общее тестирование), процесс Java начинает использовать все процессоры, и приложение замедляется.

Я заглянул в менеджер tomcat и выяснил, что существует много длительных HTTP-запросов, и все они указывают на "/gwtRequest", который является нашим сервлетом RequestFactory.

После этого я взял дамп потока и обнаружил, что все потоки http RUNNABLE в дампе указывают на "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 впервые были разработаны для работы только в браузере, который является однопоточным.

Это исправлено в транке, и оно должно превратиться в 2.5.0-rc2, которое будет выпущено через несколько дней. Вы можете отслеживать статус проблемы.

Другие вопросы по тегам