org.apaace.cantalina.co.request.parse Parameeters(Request.java:2446)Null Point Exception異常処理

4214 ワード

1、環境
tomcat 6.0.8+jdk 6+struts 1
2、問題の発生
ページには二つの異常な要求があります。
http://127.0.0.1/project/a.action?do=testA&m=10
http://127.0.0.1/project/a.action?do=testB&m=10
二つの要求はほぼ同期してserverに到達した。結果に異常がありました
java.lang.NullPointerException
	at org.apache.catalina.connector.Request.parseParameters(Request.java:2446)
	at org.apache.catalina.connector.Request.getParameter(Request.java:1040)
	at org.apache.catalina.connector.RequestFacade.getParameter(RequestFacade.java:355)
	at com.tepper.common.util.JsonUtil.jsonResponse(JsonUtil.java:101)
	at com.tepper.flow.action.TechnologyFlowAction.loadLinkers(TechnologyFlowAction.java:126)
	at com.tepper.flow.action.TechnologyFlowAction.judgeRequest(TechnologyFlowAction.java:86)
	at com.tepper.flow.action.TechnologyFlowAction.execute(TechnologyFlowAction.java:59)
	at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:419)
	at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)
	at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
	at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
	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.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at com.tepper.common.SessionFilter.doFilter(SessionFilter.java:76)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at com.tepper.common.ResFilter.doFilter(ResFilter.java:49)
	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:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:433)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
	at java.lang.Thread.run(Thread.java:619)
またはバックグラウンドに異常がなく、フロントの一番目の要求のレスポンスが戻ってきたのは2番目の要求の結果です。第二の要求にはレスポンスがない。
デバッグしたところ、2回の要求のrequestオブジェクトは同じオブジェクトであることが分かりました。Struts 1が非スレッドであることを思い出し、コードの中で、一つのアクションが複数ページの要求を受信するために、requestオブジェクトをグローバルオブジェクトとして作成しました。
3、解決する
struts 1は非スレッドで安全です。二つの同時の非同期要求は同じrequestオブジェクトを得ることができ、二つの要求は衝突を引き起こす。execution法における局所変数の使用は,スレッドの安全を保証する最も簡単な方法である。つまりstruts 1のactionを使うときは、クラスで属性を定義しないでください。グローバルのrequestオブジェクトを、execution方法に戻すと、局所変数になり、問題が解決されます。