Периодически NPE во время parseParameters в запросе Tomcat - PullRequest
1 голос
/ 22 июня 2010

У нас есть прерыванный NPE во время parseParemeters в org.apache.catalina.connector.Request. Чем больше пользователей в сети, тем больше происходит этот NPE. После перезапуска JBoss NPE на некоторое время исчезают. В течение 24 часов мы получаем от одного до более чем 400 таких NPE. Неважно, какой сервис называется. Любой запрос на обслуживание может заканчиваться этим NPE.

java.lang.NullPointerException
        at org.apache.catalina.connector.Request.parseParameters(Request.java:2517)
        at org.apache.catalina.connector.Request.getParameterNames(Request.java:1102)
        at org.apache.catalina.connector.Request.getParameterMap(Request.java:1082)
        at org.apache.catalina.connector.RequestFacade.getParameterMap(RequestFacade.java:414)
        at javax.servlet.ServletRequestWrapper.getParameterMap(ServletRequestWrapper.java:166)
        at org.jboss.seam.mock.MockExternalContext.getRequestParameterValuesMap(MockExternalContext.java:307)
        at org.jboss.seam.faces.Parameters.getRequestParameters(Parameters.java:61)
        at org.jboss.seam.Component.injectParameters(Component.java:1586)
        at org.jboss.seam.Component.inject(Component.java:1556)
        at org.jboss.seam.core.BijectionInterceptor.aroundInvoke(BijectionInterceptor.java:61)
        at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:68)
        at org.jboss.seam.transaction.TransactionInterceptor$1.work(TransactionInterceptor.java:97)
        at org.jboss.seam.util.Work.workInTransaction(Work.java:61)
        at org.jboss.seam.transaction.TransactionInterceptor.aroundInvoke(TransactionInterceptor.java:91)
        at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:68)
        at org.jboss.seam.core.MethodContextInterceptor.aroundInvoke(MethodContextInterceptor.java:44)
        at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:68)
        at org.jboss.seam.security.SecurityInterceptor.aroundInvoke(SecurityInterceptor.java:163)
        at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:68)
        at ExceptionInterceptor.aroundInvoke(ExceptionInterceptor.java:51)
        at sun.reflect.GeneratedMethodAccessor289.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.jboss.seam.util.Reflections.invoke(Reflections.java:22)
        at org.jboss.seam.intercept.Interceptor.aroundInvoke(Interceptor.java:187)
        at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:72)
        at org.jboss.seam.intercept.RootInterceptor.invoke(RootInterceptor.java:107)
        at org.jboss.seam.intercept.JavaBeanInterceptor.interceptInvocation(JavaBeanInterceptor.java:185)
        at org.jboss.seam.intercept.JavaBeanInterceptor.invoke(JavaBeanInterceptor.java:103)
        at TaskService_$$_javassist_seam_7.getNumberOfUpdatedTasks(TaskService_$$_javassist_seam_7.java)
        at sun.reflect.GeneratedMethodAccessor319.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.jboss.seam.remoting.gwt.GWTToSeamAdapter.callWebRemoteMethod(GWTToSeamAdapter.java:100)
        at org.jboss.seam.remoting.gwt.GWTService.RPC_invokeAndEncodeResponse(GWTService.java:550)
        at org.jboss.seam.remoting.gwt.GWTService.processCall(GWTService.java:206)
        at org.jboss.seam.remoting.gwt.GWTService$1.process(GWTService.java:120)
        at org.jboss.seam.servlet.ContextualHttpServletRequest.run(ContextualHttpServletRequest.java:53)
        at org.jboss.seam.remoting.gwt.GWTService.getResource(GWTService.java:105)
        at org.jboss.seam.servlet.SeamResourceServlet.service(SeamResourceServlet.java:80)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:83)
        at org.jboss.seam.web.LoggingFilter.doFilter(LoggingFilter.java:60)
        at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
        at org.jboss.seam.web.ExceptionFilter.doFilter(ExceptionFilter.java:64)
        at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
        at org.jboss.seam.web.RedirectFilter.doFilter(RedirectFilter.java:45)
        at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
        at org.jboss.seam.web.IdentityFilter.doFilter(IdentityFilter.java:40)
        at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
        at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:73)
        at org.jboss.seam.servlet.SeamFilter.doFilter(SeamFilter.java:158)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:235)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
        at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:190)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:433)
        at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:92)
        at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.process(SecurityContextEstablishmentValve.java:126)
        at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.java:70)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
        at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:330)
        at org.apache.coyote.ajp.AjpProcessor.process(AjpProcessor.java:436)
        at org.apache.coyote.ajp.AjpProtocol$AjpConnectionHandler.process(AjpProtocol.java:384)
        at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
        at java.lang.Thread.run(Thread.java:619)

Мы используем JBoss AS 5.1.0.GA, Seam 2.2.0.GA и GWT 2.0.3. JBoss получает запрос от Apache 2 через mod_jk. Предоставленный номер строки (Request.java:2517) указывает, что метод запроса является нулевым, хотя журналы, firebug (client), Apache и mod_jk показывают, что метод является POST.

В настоящее время мы не имеем ни малейшего представления о том, что может быть основной причиной NPE или как мы могли бы обойти это. Мы размышляем, связана ли проблема с:

  • Сбор мусора (JBoss запускается с -Dsun.rmi.dgc.client.gcInterval = 3600000 -Dsun.rmi.dgc.server.gcInterval = 3600000)
  • Запрос на утилизацию в Tomcat
  • Переработка цепей фильтров в Tomcat
  • mod_jk балансировка

Что мы можем сделать, чтобы найти причину этой проблемы? Есть ли возможное решение этой проблемы?

Любая помощь или предложение высоко ценится.

Спасибо!

-

Нам повезло, и мы смогли отладить трассировку стека во время NPE. Мы обнаружили, что объекты запроса в MockExternalContext не всегда совпадают с объектами запроса, которые получает SeamResourceServlet. Иногда объект запроса в MockExternalContext является новым и содержит свежий экземпляр org.apache.coyote.Request со всеми полями, установленными в null. Если запрос может быть обработан, объекты запроса, полученные с помощью SeamResourceServlet, идентичны объектам MockExternalContext.

Может ли какой-либо эксперт Seam помочь нам и сказать, когда и где в приведенном выше стековом трассировке создается MockExternalContext, используемый org.jboss.seam.faces.Parameters? При каких обстоятельствах Seam инициализирует MockExternalContext новым объектом запроса, а не тем, который предоставлен SeamResourceServlet?

Я опубликовал эту проблему на форуме Seam .

-

Обновление

В то же время мы нашли причину NPE:

Поскольку мы используем GWT на стороне клиента, все клиент-серверное взаимодействие осуществляется через GWT-RPC асинхронно. Очень редко вызов выхода из системы обгоняет другой, все еще обрабатывающий RPC. Вызов выхода из системы делает недействительным сеанс, поэтому другой RPC не может нормально завершиться, что приводит к исключению во время ServletLifecycle.endRequest (запрос); внутри ContextualHttpServletRequest. Это исключение обрабатывается ExceptionFilter. К сожалению, ExceptionFilter также не может нормально завершиться из-за недействительного сеанса, приводящего к следующей ошибке:

ERROR    [Seam Resource Servlet].error: Servlet.service() for servlet Seam Resource Servlet threw exception
java.lang.IllegalStateException: Cannot create a session after the response has been committed
        at org.apache.catalina.connector.Request.doGetSession(Request.java:2338)
        at org.apache.catalina.connector.Request.getSession(Request.java:2094)
        at org.apache.catalina.connector.RequestFacade.getSession(RequestFacade.java:833)
        at javax.servlet.http.HttpServletRequestWrapper.getSession(HttpServletRequestWrapper.java:216)
        at org.jboss.seam.mock.MockExternalContext.getSessionMap(MockExternalContext.java:357)
        at org.jboss.seam.contexts.FacesLifecycle.beginExceptionRecovery(FacesLifecycle.java:86)
        at org.jboss.seam.web.ExceptionFilter.endWebRequestAfterException(ExceptionFilter.java:96)
        at org.jboss.seam.web.ExceptionFilter.doFilter(ExceptionFilter.java:70)
        at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
        at org.jboss.seam.web.RedirectFilter.doFilter(RedirectFilter.java:45)
        at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
        at org.jboss.seam.web.IdentityFilter.doFilter(IdentityFilter.java:40)
        at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
        at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:73)
        at org.jboss.seam.servlet.SeamFilter.doFilter(SeamFilter.java:158)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:235)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
        at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:190)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:433)
        at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:92)
        at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.process(SecurityContextEstablishmentValve.java:126)
        at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.java:70)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
        at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:330)
        at org.apache.coyote.ajp.AjpProcessor.process(AjpProcessor.java:436)
        at org.apache.coyote.ajp.AjpProtocol$AjpConnectionHandler.process(AjpProtocol.java:384)
        at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
        at java.lang.Thread.run(Thread.java:619)

MockExternalContext, созданный в ExceptionFilter, «каким-то образом» остается в контексте приложения и «иногда» используется для обработки запросов. Он даже переживает повторное развертывание наших приложений, поэтому нам нужно перезапустить JBoss, чтобы избавиться от NPE.

1 Ответ

1 голос
/ 09 декабря 2010

Спасибо, ОЧЕНЬ, ОЧЕНЬ ОГРОМНОЕ за этот пост. Эта ошибка наш кошмар на несколько недель. Наш конфиг: GWT 2.0.4, шов 2.2.1 CR2, JBoss AS 5.1.0. Мы исправили механизм выхода из системы в нашем приложении, но он все еще возвращается (хотя и очень редко). Теперь кажется, что это происходит, когда транзакция длится слишком долго на уровне EJB. Теперь мы готовы избавиться от Seam, это вызывает больше проблем, чем мы можем справиться.

UPDATE: Эта странная ошибка полностью исчезла, когда область действия компонента «ServiceImpl» была изменена (просто удалена) с «SESSION» на значение по умолчанию. Также была добавлена ​​аннотация @BypassInterceptors. Тем временем я подготовил замену моста Seam-GWT для нашего приложения. Это Guice + gwt-dispatch. Очень быстрое и надежное решение.

...