1

基本上我有一个作业调度引擎,它从 cfthread 标记内执行 cfhttp 调用。这样多个作业可以同时运行。基本上,我想要做的是将超时期限延长到管理员对我的一些 cfhttp 调用的默认值之外,这样我就可以让它们完成并从我正在调用的页面中获取结果。但这并没有发生。

我的 CF 管理员请求超时设置为 30 秒。我有两个文件。第一个称为“MyThreadedCFHTTP.cfm”:

<cfthread action="run" name="job_#CreateUUID()#">
    <cfsetting requesttimeout="400" >
    <cflog text="Web Service Request: Starting" file="JobSchedulerTest" >  

    <!--- Lets do our cfhttp call --->
    <cfset var httpResults = ""/>
    <cfhttp method="get" url="http://localhost:8500/sessiontesting/CFHTTPRequestTimeOut/GetResults.cfm?RequestTime=400" result="httpResults" timeout="400"> 

    <cflog text="Web Service Result: #httpResults.FileContent#" file="JobSchedulerTest" >    
</cfthread>**strong text**

我的 cfm 文件称为“GetResults.cfm”。它只是在做任何事情之前休眠 59 秒。

<cfsetting requesttimeout="400"/>
<cfset sleep(59000)/>

这不能按预期工作。cfhttp 调用,虽然它的超时时间为 400 秒,并且我在它之前有一个 cfsetting/requesttimeout 值,但它将在 30 秒后中止并显示连接超时消息。这是服务器的默认设置。现在有趣的是,如果您删除标签,调用将成功完成。

我假设当 cfhttp 调用在某个全新的上下文中线程执行时,这有一些事情要做,因此它只能看到管理员的请求超时值。但我只是猜测。

有人可以帮我在这里找到解决方案。我可以从管理员那里删除超时值,但我真的很讨厌这样做,因为我更愿意保留它,并且只有在我明确表示时才覆盖它。

4

1 回答 1

0

我对此没有任何个人经验,但经过一番搜索后,标签似乎<cfsetting requesttimeout="">不尊重<cfthread>代码。请参阅我找到的以下参考资料。

请注意,我不建议您进行他们详述的更改,例如在 ColdFusion 管理员中禁用请求超时设置。我不认为这是一个好主意。 我只是传递我发现的这些信息。要点是<cfthread>标签不支持该<cfsetting requesttimeout="">选项。因此,您可能需要找到另一种方法来做您需要的事情或优化您的代码以在设置的超时之前完成。

Coldfusion中的cfthread和请求超时

在这个过程中,经过一些测试和玩耍,我发现了以下内容:

  1. CFthread 基本上尊重 CF 管理面板超时,如果它已设置并在超时期限后终止线程。
  2. 它不尊重使用 onRequestStart 中的 CFsetting 标记或代码中的任何位置设置的请求超时。
  3. 还有一些标签不遵守 CFthread 请求超时,它们是 CFFTP、CFEXECUTE、CFX 标签和 CFStoredProc。

增加 CFML 中线程的请求超时

如您所见,我尝试<cfsetting requestTimeout=240 />在线程顶部添加一个以尝试使其寿命更长...没有骰子。

我是否为该解决方案正确使用 <cfthread> ?

至于线程超时 - 您可以指定等待您创建的线程重新加入页面执行的最长时间,但 AFAIK 无法在您创建的线程上设置超时(如页面请求超时)。

查理·阿雷哈特 (Charlie Arehart) 有一篇关于 ColdFusion 请求超时的好文章 - CF911: Lies, Damned Lies, and CF Request Timeouts...What You May Not Realize

于 2013-07-19T12:24:13.420 回答