基本上,我有一个作业调度引擎,它从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调用在一些全新的上下文中执行的线程有关,因此它只能看到管理员的请求超时值。但我只是在猜测。
有人能帮我想出一个解决方案吗。我可以从管理员那里删除超时值,但我真的很讨厌这样做,因为我更愿意保留它,只有在我显式声明时才会覆盖它。
发布于 2013-07-19 20:24:13
我对此没有任何个人经验,但经过一些搜索后,似乎<cfthread>标签并不支持<cfsetting requesttimeout="">代码。请参阅我找到的以下参考资料。
请注意,我并不是建议您进行详细说明的更改,如在ColdFusion管理员中禁用请求超时设置。我不认为这是个好主意,,我只是在传递我找到的信息。要点是<cfthread>标签不支持<cfsetting requesttimeout="">选项。因此,您可能需要找到另一种方法来完成所需的操作,或者优化代码以在设置的超时之前完成。
cfthread and request timeout in coldfusion
在这个过程中,经过一些测试和尝试,我发现了以下内容:
Increase request timeout for a thread in CFML
正如您所看到的,我已经尝试在线程顶部添加一个<cfsetting requestTimeout=240 />,以使其存活时间更长……没有骰子。
Am I utilizing correctly for this solution?
对于线程超时-你可以指定等待你创建的线程重新加入页面执行的最大时间,但是AFAIK没有办法在你创建的线程上设置超时(比如页面请求超时)。
Charlie Arehart有一篇关于ColdFusion请求超时的很好的文章-- CF911: Lies, Damned Lies, and CF Request Timeouts...What You May Not Realize
https://stackoverflow.com/questions/17734819
复制相似问题