是否可以停止ColdFusion请求?

时间:2020-03-06 15:02:21  来源:igfitidea点击:

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

我不仅希望停止flex应用程序的请求,而且希望停止CFC请求。这可能吗?最好的方法是什么?

解决方案

我们可以使用<cfabort />或者<cfsetting requesttimeout =" 0" />`以编程方式结束请求,但这是在CF服务器端,我不认为这是我们要的吗?

远程结束它...好吧,如果我们有FusionReactor,则可以使用Flex与它联系并让它为我们中断请求。
(我们当然可以尝试在FusionReactor中终止请求,但是Flex是否可以实际要求FR停止它……我们必须在FR邮件列表中询问是否有办法做到这一点。)

可能的另一种解决方案是尝试设计搜索结构,使其可以处理多个请求,但是可行程度将取决于我们要搜索的内容。

如果我们使用的是ColdFusion 8,则可以使用&lt;cfthread>标签。我们可以在其自己的线程上生成搜索过程,然后根据需要使用远程调用终止搜索线程。

  • cfthread的Livedoc页面
  • 在ColdFusion中使用线程

我认为没有直接的方法可以在外部停止寻呼。根据文档,只有线程本身及其父级可以中止给定线程。

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

假设我们调用一个方法来启动一些后台处理。它生成唯一的线程ID,并将其返回给调用方。线程在(例如)告诉它停止的应用程序范围中寻找一个标志。它在后台进程的每个子步骤中进行检查。抛出标志的任何时候都可能中止。

要抛出该标志,请添加一个采用要中止的线程名称的中止方法,并具有足够的安全性,以确保第3方不能只是开始杀死线程。

为了增加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>