我们有几个回购,其中需要允许单个页面(例如,计划的维护操作)执行更长的请求(例如,5分钟)。
然而,在一个回购中,将requesttimeout设置为360似乎完全无效!无论我们将此值设置为60,都会超时。
<cfcomponent>
<cfsetting requesttimeout="360" />
<cffunction
name="doit"
access="public"
returntype="string"
output="true" >
<cfinclude template="arrComs.inc.cfm">
<cfset strHTMLReport = '<ul>'>
<cfloop array="#arrComs#" index="i">
<cfscript>
thisCom = CreateObject( 'component', i.fileSansExt );
skvResult = thisCom.generate();
// Sleep for 5 seconds to give MySQL a bit of breathing space
sleep( 3000 );
</cfscript>
<cfset strHTMLReport &= '<li>' & skvResult.msg & '</li>'>
</cfloop>
<cfset strHTMLReport &= '</ul>'>
<cfreturn strHTMLReport>
</cffunction>
</cfcomponent>
有什么想法吗?我在哪里可以帮助诊断这个?可以设置多少个位置请求超时,为什么它看起来像repo特定?
答案 0 :(得分:3)
已解决:从循环内调用的2个组件中删除了相同的1行代码。这些行将RequestTimeout设置为60,从而覆盖父级中设置的超时。
Humble Pie Time:我的错误是忘记了循环内部调用的组件也有一行代码,将超时设置为60秒。虽然错误报告了超时,但尚不清楚确切的位置。事后我应该搜索我的代码库中的数字60,我会更快找到2条违规行。
进一步思考,在研究这个时,我发现CFLOOP和CFQUERY都有超时限制,可以设置为彻底性我也增加了组件中MySQL查询的超时。
进一步思考,在循环中先前调用的组件更改了稍后调用的组件的requesttimeout。因此,虽然我通过检查父函数和它超时的函数来诊断,但我没有任何理由怀疑先前在该过程中调用的组件。