是否可以停止ColdFusion请求?

时间:2008-10-02 17:31:15

标签: flex coldfusion

我有一个Flex应用程序,它调用一个搜索大型文档集合的函数。根据搜索词,用户可能希望停止flex的请求。

我不仅希望停止Flex应用程序预期请求,还要停止CFC请求。这可能吗?这样做的最佳方法是什么?

4 个答案:

答案 0 :(得分:6)

我认为没有直接方式来阻止外部页面调用。根据文档,只有线程本身及其父级可以中止给定的线程。

但是,您可以在共享范围内为给定线程设置标志。

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

要抛出该标志,请添加一个中止方法,该方法获取要中止的线程的名称,以及足够的安全性,以确保第三方不能只是开始杀死线程。

答案 1 :(得分:2)

要添加Ben 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>

答案 2 :(得分:1)

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

答案 3 :(得分:0)

您可以使用<cfabort/><cfsetting requesttimeout="0"/>以编程方式结束请求 - 但这是在CF服务器端的事情,我认为这不是您所要求的?

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


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