2014-06-26 37 views
3

我有一件很奇怪的事情发生,似乎无法跟踪它。我有一个简单形式的简单CFM,用户按下提交按钮,页面POSTs自己,然后调用一个带有<cfinvoke>的CFC函数。正在调用的函数只有一个调用Oracle的<cfstoredproc>。 Oracle过程应该创建大约3000多条记录。但它创造的数量恰好是这个数字的两倍。我在<cfstoredproc>调用之前放置了一个<cflog>,并且创建了2个条目。所以这个功能被第二次以某种方式解雇了。相同的用户,相同的SessionID,不同的ThreadID。我不知道这第二个电话是从哪里来的。ColdFusion - 重复POST被解雇

  • 我只按下按钮一次。
  • 我看了网络流量,我只看到一个POST。

我把<cflock>围绕<cfstoredproc>调用,并解决了这个问题,现在只创建了超过3000个recs。但是现在我得到了这个神秘的第二个电话的锁定超时错误。

另一个奇怪的是<cflock>超时时间为30秒。但<cflog>最初只显示1个条目,然后恰好60秒后出现第二个日志条目并发生<cflock>错误。我将<cflock>超时下降到15秒,结果仍然相同。为什么这次第二次神秘通话每次都会在第一次之后1分钟记录下来?

我正在运行ColdFusion 10,0,13,287689。

"Severity","ThreadID","Date","Time","Application","Message" 

"Information","ajp-bio-8012-exec-9","06/26/14","14:59:34",,"D:\ColdFusion10\cfusion\logs\cbruserwo_cfc.log initialized" 
"Information","ajp-bio-8012-exec-9","06/26/14","14:59:34","xxx","USERA // USERA // 1958938 // lockname: B-100139230442054" 
"Information","ajp-bio-8012-exec-7","06/26/14","15:00:35","xxx","USERA // USERA // 1958938 // lockname: B-100139230442054" <-- the mysterious one, comes in 1 minute later 

"Information","ajp-bio-8012-exec-12","06/26/14","15:08:36","xxx","USERA // USERA // 1958938 // lockname: B-100139230442054" 
"Information","ajp-bio-8012-exec-5","06/26/14","15:09:37","xxx","USERA // USERA // 1958938 // lockname: B-100139230442054" <-- the mysterious one, comes in 1 minute later 

"Information","ajp-bio-8012-exec-1","06/26/14","15:19:54","xxx","USERA // USERA // 1958938 // lockname: B-100139230442054" 
"Information","ajp-bio-8012-exec-7","06/26/14","15:20:57","xxx","USERA // USERA // 1958938 // lockname: B-100139230442054" <-- the mysterious one, comes in 1 minute later 

我正在使用的Application.cfc同时与onRequestonCFCRequest方法(与其他常用的放在一起)。

某些代码...

<cfcomponent> 
<cffunction name="create" access="public"> 
...removed some trivial code... 

<!--- START: debug this craziness ---> 
<cflock timeout="30" name="A-#form.cbrorderunid#"> 
    <cfif not isdefined("session.cbruserwo_cfc.calledcnt")> 
     <cfset session.cbruserwo_cfc.calledcnt = 1> 
    <cfelse> 
     <cfset session.cbruserwo_cfc.calledcnt = session.cbruserwo_cfc.calledcnt+1> 
    </cfif> 

    <cflog file="cbruserwo_cfc" text="#session.sv.un# // #session.sv.fullname# // #session.sv.csid# // lockname: B-#form.cbrorderunid#"> 

    <cfsavecontent variable="xxx"> 
     <cfoutput> 
     session.cbruserwo_cfc.calledcnt: #session.cbruserwo_cfc.calledcnt#<br> 
     CGI: <cfdump var="#cgi#"> 
     FORM: <cfdump var="#form#"> 
     URL: <cfdump var="#url#"> 
     ARGUMENTS: <cfdump var="#arguments#"> 
     </cfoutput> 
    </cfsavecontent> 
    <cffile action= "write" file="D:\temp\cbruserwo_cfc.html" addNewLine="no" output="#xxx#"> 
</cflock> 
<!--- END: debug this craziness ---> 

<!--- The debug code above shows another POST/call/request something being made, but the network traffic shows only 1 POST happening ---> 

<cflock timeout="30" name="B-#form.cbrorderunid#"> 
    <cfstoredproc> 
     <!--- 
     This is the call that would do the 3000+ inserts, omitted contents, irrelavent to question. 
     The cflock around it fixes the duplicate records from being created, but now I get lock timeout 
     errors from this mysterious second request. 
     ---> 
    </cfstoredproc> 
</cflock> 
...removed some trivial code... 
</cffunction> 
</cfcomponent> 

UPDATE ...

有人要求所有的代码有的说不要发布所有的代码,所以我不知道你们想要什么。我承认这是一个奇怪的。我们最近添加了application.cfc-> onRequest函数。不知道这与它有什么关系。但它现在所做的全部是...

<cffunction name="onRequest" access="public"> 
    <cfargument name="TargetPage" type="string" required="true" /> 

    <!--- Make these functions globally accessible ---> 
    <cfset structAppend(url, createObject("component", "lib_globalfunctions"))> 

    <!--- Include the requested page. ---> 
    <cfinclude template="#ARGUMENTS.TargetPage#" /> 
</cffunction> 

我也检查了所有的Apache ssl_requestlog的,只有一个帖子发生。这就是为什么我没有显示任何我的HTML,表单,按钮,提交代码。

我会尝试翻出所有customtags /专有代码,并提出一个缺陷的裸骨通用复制。如果我能我会重写这个问题并发布。这需要一些时间。只是想知道是否有人听说过这样的错误,看起来像没有人,谢谢。

更多的更新...

它正在越来越不像一个ColdFusion问题。

每个项目符号对于每个用户都是一致的重复项。

  • ME - 最新版本的Chrome,第二个神秘的请求发生。
  • 其他用户 - 同一建筑物,相同版本的Chrome,无第二次请求。
  • ME-IE10,没有第二个请求。
  • 其他用户 - 在建筑物外部,IE10发生第二个神秘请求。
+0

将表单处理拆分为单独的文件:form.cfm> form_processing.cfm。然后重定向到form.cfm,如果这是您的工作流程。在该设置下查看代码是否触发两次。此外,您是否使用JavaScript提交表单?我见过JavaScript submit()触发的情况,但正常的表单提交事件也会触发。 –

+0

我不太清楚当你没有发布任何代码时人们应该如何帮助你。?不要描述代码,只需发布​​它(或者最好是一个证明问题的简化再现案例)。 –

+1

我同意@iKnowKungFoo一旦你分开那头猪,你很可能会发现问题。你也应该把你的代码放在这里,这样我们可以更有效地帮助你。 ;)它也使得一个很好的单元测试能够分解你的代码。只需测试您的表单行为,而不是服务器端事件可以帮助标准化表单。也许你有一个duped form变量,转储出你的表单并像这样终止''我敢打赌,一些谜团将会被揭示。 –

回答

0

检查您的application.cfc/application.cfm,看看是否有onRequest函数中POST数据的任何操作。

+0

不是我能说的。我更新了原来的问题,添加了onRequest函数。谢谢。 – gfrobenius

0

你可能运行在梭子鱼防火墙后面吗?如果是这样,他们可能会如何处理“会话超时”。我遇到了确切的问题,并将其追溯到防火墙。他们的默认会话超时为60秒,之后他们向浏览器发送408超时错误,迫使其发送第二个请求。

希望这会有所帮助。

+0

我们不使用梭子鱼。最后,我记得我开始寻找类似的东西,但为Web服务器。我正在研究Apache来看看它是否在做与你所描述的类似的事情。我不得不开始另一项任务,但是当我回来重新访问它时,我会更新这个问题。谢谢! – gfrobenius