是否可以停止ColdFusion请求?

问题描述:

我有一个Flex应用程序,它调用一个搜索大型文档集合的函数。根据搜索词,用户可能想要停止flex的请求。是否可以停止ColdFusion请求?

我想不仅停止弹性应用程序期望的请求,但也停止CFC请求。这可能吗?这样做的最佳方法是什么?

要添加到本Doom的答案,我包括一些可以实现的方式的示例代码。有多种方法和名称的方式,组织和调用下面的代码,但希望它是有帮助的。

在请求启动过程中的某个时间点,将有关进程的信息存储在共享作用域中,并将ID返回给客户端。以下是可用于页面或远程请求的示例函数。然后

<cffunction name="createProcess" output="false"> 
    <cfset var id = createUUID()> 
    <cfset application.processInfo[id] = { 
    progress = 0, 
    kill = false 
    }> 
    <cfreturn id /> 
</cffunction> 

客户端可以通过轮询服务器检查进展,或一个循环期间提交请求杀死过程

<cffunction name="getProcessProgress" output="false"> 
    <cfargument name="processID" required="true"> 
    <cfreturn application.processInfo[arguments.processID].progress /> 
</cffunction> 

<cffunction name="killProcess" output="false"> 
    <cfargument name="processID" required="true"> 
    <cfset application.processInfo[arguments.processID].kill = true /> 
</cffunction> 

在考虑中的实际的服务器端过程可以然后打一个功能,例如,对检查是否应该中止处理并根据需要清理任何工作。

<cffunction name="shouldKillProcess" output="false"> 
    <cfargument name="processID" required="true"> 
    <cfreturn application.processInfo[arguments.processID].kill /> 
</cffunction> 

你可以用<cfabort/><cfsetting requesttimeout="0"/>以编程方式结束请求 - 但这是在CF服务器端,我不认为你在问什么?

远程结束它......好吧,如果你有FusionReactor,可能有可能联系那些使用Flex,并让它中断你的请求。 (你当然可以尝试在FusionReactor中结束请求,但是Flex是否真的可以让FR停止它的请求......如果有办法做到这一点,你必须在FR邮件列表上提问)。


可能的替代解决方案是尝试构建搜索,以便它可以处理多个请求,但这种可行性取决于您正在搜索的内容。

如果您使用ColdFusion 8,则可以使用<cfthread>标签。您可以在自己的线程上产生搜索进程,然后根据需要使用远程调用来终止搜索线程。

+0

线程在请求​​中工作,而不是跨多个请求? – 2008-10-02 18:53:27

我不认为这是一个直接方式从外部停止寻呼呼叫。根据文档,只有线程本身和它的父母可以放弃给定的线程。

但是,您可以为共享作用域中的给定线程设置标志。

假设你调用一个启动一些后台处理的方法。它生成一个唯一的线程ID并将其返回给调用者。该线程在(例如)告诉它停止的应用程序范围中查找一个标志。它检查后台进程的每个子步骤。它可以在任何时候抛弃国旗。

要抛出该标志,请添加一个中止方法,该方法将取消要中止的线程的名称以及足够的安全性,以确保第三方不能仅仅开始关闭线程。