【问题标题】:CFTHREAD CFHTTP timeoutCFTHREAD CFHTTP 超时
【发布时间】:2013-07-19 21:11:52
【问题描述】:

基本上,我有一个作业调度引擎,它从 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 调用在某个全新的上下文中线程执行时,这有一些事情要做,因此它只能看到管理员的请求超时值。但我只是猜测。

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

【问题讨论】:

  • 您尝试使用 cfhttp 获取的页面可能是超时的页面。但我猜。
  • @Dan,我调用的文件是“GetResults.cfm”页面,其代码为:。此页面不会超时,因为我在该文件中设置了 requesttimeout 值。奇怪的是,如果我删除上面代码周围的“cfthread”标签并调用页面,一切都会按预期运行,没有超时。

标签: coldfusion coldfusion-9


【解决方案1】:

我对此没有任何个人经验,但经过一番搜索,&lt;cfthread&gt; 标记似乎不支持&lt;cfsetting requesttimeout=""&gt; 代码。请参阅我找到的以下参考资料。

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

cfthread and request timeout in coldfusion

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

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

Increase request timeout for a thread in CFML

如您所见,我已尝试将&lt;cfsetting requestTimeout=240 /&gt; 添加到线程顶部以尝试使其寿命更长...没有骰子。

Am I utilizing <cfthread> correctly for this solution?

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

Charlie Arehart 有一篇关于 ColdFusion 请求超时的好文章 - CF911: Lies, Damned Lies, and CF Request Timeouts...What You May Not Realize

【讨论】:

  • @Miquel-F,完全听到你的声音,但我已经这样做了。如果您查看我开始 cfthread 标记之后的行,您会看到我已将 requesttimeout 设置为 400。我将 放在 cfthread 标记之前还是之后都没有关系,我得到了结果相同,即 cfhttp 超时。其他想法?
  • @user2592724 - 但这就是我想要表达的观点......这只是基于搜索,我对此没有任何个人经验。 &lt;cfthread&gt; 标签忽略 &lt;cfsetting requesttimeout=""&gt; 标签。根据 ColdFusion 管理员中的设置,它将始终超时。
  • 我的回应是您发表的第一篇文章“您的 代码需要进入调用模板,即进行 cfhttp 调用的模板; MyThreadedCFHTTP.cfm 在您的示例中。不在被调用的页面中。'。您更新的内容很有意义。这很有趣,因为 cfthread 将根据需要运行。它是基于管理员设置超时的 cfhttp 标记。我想我可能需要遵循第一个链接中的建议。感谢您对此进行调查。
  • 哦,对了。我一开始答错了。重新阅读您的代码后,我看到您正在做我提到的事情。然后我开始搜索并找到上面的信息,所以我更新了我的答案。 小心禁用管理员中的超时设置我会犹豫这样做。
猜你喜欢
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-01
  • 2016-08-15
  • 1970-01-01
相关资源
最近更新 更多