DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT <http://nagoya.apache.org/bugzilla/show_bug.cgi?id=22274>. ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND INSERTED IN THE BUG DATABASE.
http://nagoya.apache.org/bugzilla/show_bug.cgi?id=22274 Bizzare double-execution problem Summary: Bizzare double-execution problem Product: Struts Version: 1.1 Final Platform: PC OS/Version: Windows NT/2K Status: NEW Severity: Normal Priority: Other Component: Controller AssignedTo: [EMAIL PROTECTED] ReportedBy: [EMAIL PROTECTED] I am experiencing a very strange problem where when a user posts data from a form, a struts action gets executed twice instead of once. I get this problem with struts 1.1 and from the most recent version of struts from the cvs repository (I downloaded that this morning). I turned on log4j logging at the trace level for the org.apache.struts.action package, and it looks like two threads are being spawned for some reason. I edited the ActionServlet.process method so that it now looks like the code below (I just added the log.trace statement). protected void process(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { log.trace("**************************** ActionServlet.process"); ModuleUtils.getInstance().selectModule(request, getServletContext()); getRequestProcessor(getModuleConfig(request)).process(request, response); } Here is the log4j output. It's confusing because every line prints out twice for some reason (I guess I have log4j installed incorrectly), but if you watch the threads, the process method is actually being called twice by two different threads! DEBUG [Thread-1] (ActionServlet.java:1155) - **************************** ActionServlet.process DEBUG [Thread-1] (ActionServlet.java:1155) - **************************** ActionServlet.process DEBUG [Thread-1] (RequestProcessor.java:214) - Processing a 'POST' for path '/saveLinks' DEBUG [Thread-1] (RequestProcessor.java:214) - Processing a 'POST' for path '/saveLinks' DEBUG [Thread-1] (RequestProcessor.java:361) - Storing ActionForm bean instance in scope 'request' under attribute key 'linkingInfo' DEBUG [Thread-1] (RequestProcessor.java:361) - Storing ActionForm bean instance in scope 'request' under attribute key 'linkingInfo' DEBUG [Thread-1] (RequestProcessor.java:777) - Populating bean properties from this request DEBUG [Thread-1] (RequestProcessor.java:777) - Populating bean properties from this request DEBUG [Thread-2] (ActionServlet.java:1155) - **************************** ActionServlet.process DEBUG [Thread-1] (RequestProcessor.java:906) - Validating input form properties DEBUG [Thread-1] (RequestProcessor.java:906) - Validating input form properties DEBUG [Thread-1] (RequestProcessor.java:911) - No errors detected, accepting input DEBUG [Thread-1] (RequestProcessor.java:911) - No errors detected, accepting input DEBUG [Thread-2] (ActionServlet.java:1155) - **************************** ActionServlet.process DEBUG [Thread-2] (RequestProcessor.java:214) - Processing a 'POST' for path '/saveLinks' DEBUG [Thread-2] (RequestProcessor.java:214) - Processing a 'POST' for path '/saveLinks' DEBUG [Thread-2] (RequestProcessor.java:361) - Storing ActionForm bean instance in scope 'request' under attribute key 'linkingInfo' DEBUG [Thread-1] (RequestProcessor.java:294) - Looking for Action instance for class com.bah.ebspnp.relatedLinks.SaveLinksAction DEBUG [Thread-1] (RequestProcessor.java:294) - Looking for Action instance for class com.bah.ebspnp.relatedLinks.SaveLinksAction DEBUG [Thread-1] (RequestProcessor.java:304) - Returning existing Action instance DEBUG [Thread-1] (RequestProcessor.java:304) - Returning existing Action instance DEBUG [Thread-2] (RequestProcessor.java:361) - Storing ActionForm bean instance in scope 'request' under attribute key 'linkingInfo' DEBUG [Thread-1] (SaveLinksAction.java:43) - Begin SaveLinksAction.execute DEBUG [Thread-1] (SaveLinksAction.java:43) - Begin SaveLinksAction.execute DEBUG [Thread-2] (RequestProcessor.java:777) - Populating bean properties from this request DEBUG [Thread-2] (RequestProcessor.java:777) - Populating bean properties from this request DEBUG [Thread-2] (RequestProcessor.java:906) - Validating input form properties DEBUG [Thread-2] (RequestProcessor.java:906) - Validating input form properties DEBUG [Thread-2] (RequestProcessor.java:911) - No errors detected, accepting input DEBUG [Thread-2] (RequestProcessor.java:911) - No errors detected, accepting input DEBUG [Thread-2] (RequestProcessor.java:294) - Looking for Action instance for class com.bah.ebspnp.relatedLinks.SaveLinksAction DEBUG [Thread-2] (RequestProcessor.java:294) - Looking for Action instance for class com.bah.ebspnp.relatedLinks.SaveLinksAction DEBUG [Thread-2] (RequestProcessor.java:304) - Returning existing Action instance DEBUG [Thread-2] (RequestProcessor.java:304) - Returning existing Action instance DEBUG [Thread-2] (SaveLinksAction.java:43) - Begin SaveLinksAction.execute DEBUG [Thread-2] (SaveLinksAction.java:43) - Begin SaveLinksAction.execute DEBUG [Thread-1] (SaveLinksAction.java:88) - insert into bin_bin ( bin_id_cd1, bin_id_cd2 ) values ( 16, 355 ) DEBUG [Thread-1] (SaveLinksAction.java:88) - insert into bin_bin ( bin_id_cd1, bin_id_cd2 ) values ( 16, 355 ) DEBUG [Thread-2] (SaveLinksAction.java:88) - insert into bin_bin ( bin_id_cd1, bin_id_cd2 ) values ( 16, 355 ) DEBUG [Thread-2] (SaveLinksAction.java:88) - insert into bin_bin ( bin_id_cd1, bin_id_cd2 ) values ( 16, 355 ) DEBUG [Thread-2] (ExceptionHandler.java:155) - ExceptionHandler caught this exception: java.sql.SQLException: ORA-00001: unique constraint (EBSPNP_ADMIN.SYS_C002397) violated at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134) at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:289) at oracle.jdbc.ttc7.Oall7.receive(Oall7.java:573) at oracle.jdbc.ttc7.TTC7Protocol.doOall7(TTC7Protocol.java:1891) at oracle.jdbc.ttc7.TTC7Protocol.parseExecuteFetch(TTC7Protocol.java:1093) at oracle.jdbc.driver.OracleStatement.executeNonQuery (OracleStatement.java:2047) at oracle.jdbc.driver.OracleStatement.doExecuteOther(OracleStatement.java:1940) at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout (OracleStatement.java:2709) at oracle.jdbc.driver.OracleStatement.execute(OracleStatement.java:854) at org.apache.commons.dbcp.DelegatingStatement.execute (DelegatingStatement.java:184) at com.bah.krm.util.SqlUtils.execute(SqlUtils.java:182) at com.bah.ebspnp.relatedLinks.SaveLinksAction.execute(SaveLinksAction.java:92) at org.apache.struts.action.RequestProcessor.processActionPerform (RequestProcessor.java:448) at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:264) at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1157) at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:473) at javax.servlet.http.HttpServlet.service(HttpServlet.java:760) at javax.servlet.http.HttpServlet.service(HttpServlet.java:853) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.java:247) at org.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java:193) at org.apache.catalina.core.StandardWrapperValve.invoke (StandardWrapperValve.java:256) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNex t(StandardPipeline.java:643) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995) at org.apache.catalina.core.StandardContextValve.invoke (StandardContextValve.java:191) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNex t(StandardPipeline.java:643) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995) at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2415) at org.apache.catalina.core.StandardHostValve.invoke (StandardHostValve.java:180) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNex t(StandardPipeline.java:643) at org.apache.catalina.valves.ErrorDispatcherValve.invoke (ErrorDispatcherValve.java:171) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNex t(StandardPipeline.java:641) at org.apache.catalina.valves.ErrorReportValve.invoke (ErrorReportValve.java:172) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNex t(StandardPipeline.java:641) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995) at org.apache.catalina.core.StandardEngineValve.invoke (StandardEngineValve.java:174) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNex t(StandardPipeline.java:643) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995) at org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java:223) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:594) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnectio n(Http11Protocol.java:392) at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:565) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run (ThreadPool.java:619) at java.lang.Thread.run(Thread.java:479) DEBUG [Thread-2] (ExceptionHandler.java:155) - ExceptionHandler caught this exception: java.sql.SQLException: ORA-00001: unique constraint (EBSPNP_ADMIN.SYS_C002397) violated at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134) at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:289) at oracle.jdbc.ttc7.Oall7.receive(Oall7.java:573) at oracle.jdbc.ttc7.TTC7Protocol.doOall7(TTC7Protocol.java:1891) at oracle.jdbc.ttc7.TTC7Protocol.parseExecuteFetch(TTC7Protocol.java:1093) at oracle.jdbc.driver.OracleStatement.executeNonQuery (OracleStatement.java:2047) at oracle.jdbc.driver.OracleStatement.doExecuteOther(OracleStatement.java:1940) at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout (OracleStatement.java:2709) at oracle.jdbc.driver.OracleStatement.execute(OracleStatement.java:854) at org.apache.commons.dbcp.DelegatingStatement.execute (DelegatingStatement.java:184) at com.bah.krm.util.SqlUtils.execute(SqlUtils.java:182) at com.bah.ebspnp.relatedLinks.SaveLinksAction.execute(SaveLinksAction.java:92) at org.apache.struts.action.RequestProcessor.processActionPerform (RequestProcessor.java:448) at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:264) at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1157) at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:473) at javax.servlet.http.HttpServlet.service(HttpServlet.java:760) at javax.servlet.http.HttpServlet.service(HttpServlet.java:853) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.java:247) at org.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java:193) at org.apache.catalina.core.StandardWrapperValve.invoke (StandardWrapperValve.java:256) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNex t(StandardPipeline.java:643) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995) at org.apache.catalina.core.StandardContextValve.invoke (StandardContextValve.java:191) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNex t(StandardPipeline.java:643) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995) at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2415) at org.apache.catalina.core.StandardHostValve.invoke (StandardHostValve.java:180) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNex t(StandardPipeline.java:643) at org.apache.catalina.valves.ErrorDispatcherValve.invoke (ErrorDispatcherValve.java:171) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNex t(StandardPipeline.java:641) at org.apache.catalina.valves.ErrorReportValve.invoke (ErrorReportValve.java:172) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNex t(StandardPipeline.java:641) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995) at org.apache.catalina.core.StandardEngineValve.invoke (StandardEngineValve.java:174) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNex t(StandardPipeline.java:643) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995) at org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java:223) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:594) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnectio n(Http11Protocol.java:392) at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:565) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run (ThreadPool.java:619) at java.lang.Thread.run(Thread.java:479) DEBUG [Thread-2] (RequestProcessor.java:397) - processForwardConfig (ForwardConfig [name=null,path=/../common/exception.jsp,redirect=false,contextRelative=false]) DEBUG [Thread-2] (RequestProcessor.java:397) - processForwardConfig (ForwardConfig [name=null,path=/../common/exception.jsp,redirect=false,contextRelative=false]) DEBUG [Thread-1] (SaveLinksAction.java:103) - End SaveLinksAction.execute DEBUG [Thread-1] (SaveLinksAction.java:103) - End SaveLinksAction.execute DEBUG [Thread-1] (RequestProcessor.java:397) - processForwardConfig (ForwardConfig[name=null,path=/bin/binInfo.do? method=view&id=16,redirect=true,contextRelative=true]) DEBUG [Thread-1] (RequestProcessor.java:397) - processForwardConfig (ForwardConfig[name=null,path=/bin/binInfo.do? method=view&id=16,redirect=true,contextRelative=true]) ERROR [Thread-2] (exception_0002dbody_jsp.java:97) - java.sql.SQLException: ORA- 00001: unique constraint (EBSPNP_ADMIN.SYS_C002397) violated The exception is occuring because the SQL statement I am trying to execute gets executed twice, which is not OK. Since the ActionServlet.process method is called twice, I am inclined to think there is something wrong with my web server configuration and that this issue is not a struts problem, but I'm not sure. Here is my configuration for the ActionServlet in my web.xml file. Am I doing something wrong? <servlet> <servlet-name>ebspnp</servlet-name> <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> <init-param> <param-name>config</param-name> <param-value>/WEB-INF/struts-config.xml</param-value> </init-param> <init-param> <param-name>config/admin</param-name> <param-value>/WEB-INF/struts-config-admin.xml</param-value> </init-param> <init-param> <param-name>config/adminPicklist</param-name> <param-value>/WEB-INF/struts-config-adminPicklist.xml</param-value> </init-param> <init-param> <param-name>config/adminDev</param-name> <param-value>/WEB-INF/struts-config-adminDev.xml</param-value> </init-param> <init-param> <param-name>config/bin</param-name> <param-value>/WEB-INF/struts-config-bin.xml</param-value> </init-param> <init-param> <param-name>config/bpac</param-name> <param-value>/WEB-INF/struts-config-bpac.xml</param-value> </init-param> <init-param> <param-name>config/example</param-name> <param-value>/WEB-INF/struts-config-example.xml</param-value> </init-param> <init-param> <param-name>config/pe</param-name> <param-value>/WEB-INF/struts-config-pe.xml</param-value> </init-param> <init-param> <param-name>config/relatedLinks</param-name> <param-value>/WEB-INF/struts-config-relatedLinks.xml</param-value> </init-param> <init-param> <param-name>config/roadmap</param-name> <param-value>/WEB-INF/struts-config-roadmap.xml</param-value> </init-param> <init-param> <param-name>config/scenario</param-name> <param-value>/WEB-INF/struts-config-scenario.xml</param-value> </init-param> <init-param> <param-name>config/project</param-name> <param-value>/WEB-INF/struts-config-project.xml</param-value> </init-param> <init-param> <param-name>host</param-name> <param-value>localhost</param-value> </init-param> <init-param> <param-name>port</param-name> <param-value>80</param-value> </init-param> </servlet> --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]