ColdFusion 11 如何一次执行一个代码块



我需要为每个请求一次执行一个代码块。用 cflock 标签包装代码块是不可能的,因为代码运行了很长时间,因此很容易超时(这是对 Web 服务的调用,需要大量的来回)。

我尝试了以下技术来绕过 cflock 标签的使用:

对于每个请求,我递增一个应用程序变量(初始化为 1),并将其分配给表示请求排名的局部变量。

在一个请求完成执行长时间运行的代码后,我递增另一个应用程序变量(也初始化为 1)。

因此,对于后续请求,我将它们的排名与后一个应用程序变量进行比较。因此,虽然这两个值不相等,但我会做一个循环。

下面是代码:

<cflock timeout="1" type="exclusive" throwontimeout="true">
<cfif NOT structKeyExists(APPLICATION,'currentRequestOrder')>
<cfset APPLICATION.currentRequestOrder = 1>
<cfset APPLICATION.nbRequestsRunning = 1>
<cfelse>
<cfset APPLICATION.nbRequestsRunning = APPLICATION.nbRequestsRunning + 1>
</cfif>
</cflock>
<cfset thisRequestOrder = APPLICATION.nbRequestsRunning>
<cfloop condition="thisRequestOrder NEQ APPLICATION.currentRequestOrder">
</cfloop>
<long running of code>
</long running of code>
<cflock timeout="1" type="exclusive" throwontimeout="true">
<cfif APPLICATION.currentRequestOrder LT APPLICATION.nbRequestsRunning>
<cfset APPLICATION.currentRequestOrder = APPLICATION.currentRequestOrder + 1>
</cfif>
</cflock>

此代码的行为是,在第一个请求之后的请求不会通过循环。换句话说,cfloop 的条件总是计算为 true。

我正在寻找的最终解决方案是让长时间运行的代码一次执行每个请求一次。

我们有一个要通过队列的过程。由于 ColdFusion 中的内存泄漏,我们不希望它一次处理所有队列。我们的解决方案是通过在前一个请求的末尾调用一个新请求来链接请求。

<cfif url.step lt 5>
<cfhttp url="#currentTemplate#?step=#url.step+1#" timeout="0" />
</cfif>

或者您可以命名步骤。无论哪种方式,这都是一种通过将长时间运行的请求分解为步骤来防止它们的方法。您可以将中间数据保存在数据库、应用程序变量等中。

相关内容

最新更新