基本上我有一个作业调度引擎,可以在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秒之后将使用Connection Timeout消息中止。这是服务器的默认设置。现在有趣的是,如果删除标签,呼叫将成功完成。
我假设当cfhttp调用在一些全新的上下文中执行时,它有一些事情需要做,因此它只能看到管理员的请求超时值。但我只是在猜测。
有人可以帮我解决这个问题。我可以从管理员那里删除超时值,但我真的不想这样做,因为我更愿意保留它并且只在我明确说出时才覆盖它。
答案 0 :(得分:0)
我对此没有任何个人经验,但经过一些搜索后,<cfsetting requesttimeout="">
代码似乎没有遵守<cfthread>
代码。请参阅我发现的以下参考资料。
请注意,我建议您不要进行详细更改,例如在ColdFusion管理员中禁用请求超时设置。我认为这不是一个好主意。我只是传递了我发现的这些信息。要点是<cfthread>
标记不支持<cfsetting requesttimeout="">
选项。因此,您可能需要找到另一种方法来完成所需操作或优化代码以在设置超时之前完成。
cfthread and request timeout in coldfusion
在这个过程中,我经过一些测试和游戏后发现了以下内容:
- CFthread基本上尊重CF管理面板超时(如果已设置)并在超时期限后终止该线程。
- 它不尊重使用onRequestStart中的CFsetting标记或代码中的任何位置设置的请求超时。
- 仍有某些标签不遵守CFthread请求超时,它们是CFFTP,CFEXECUTE,CFX标签和CFStoredProc。
醇>
Increase request timeout for a thread in CFML
正如你所看到的,我尝试在帖子的顶部添加
<cfsetting requestTimeout=240 />
以尝试让它活得更久......没有骰子。
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