因此,我对使用Coldfusion solr搜索(刚刚从CF8 Mac OS X服务器移至Linux CF9服务器)还很陌生,并且我想知道处理自动更新集合的最佳方法是什么。我知道预定的任务是为此目的而设计的,但是我无法在线找到任何示例。
我目前有一个计划任务,它通过获取集合列表并在循环中使用cfindex标记来运行refresh命令来每周更新所有集合。不过,这非常耗费处理时间,并且大约需要十分钟才能更新我到目前为止设置的四个集合。当我在浏览器中运行它时,此方法有效,但是当我从计划任务管理页面运行任务时,出现此错误“请求已超出允许的时间限制标签:CFLOOP”。
有更好的方法来处理更新的集合吗?如果我下达了单独更新每个集合的任务会更好吗?
这是我的更新代码。
<cfsetting requesttimeout="1800">
<cfcollection action="list" name="collections" engine="solr">
<cfloop query="collections">
<cfindex collection="#name#" action="refresh" extensions=".pdf, .html, .htm, .cfml, .cfm" type="path" key="/home/#name#/public_html/" recurse="yes">
</cfloop>
最佳答案
在ColdFusion的早期版本中,可以在任何HTTP请求上传递URL参数,以更改请求页面的服务器超时。您可能从计划的任务配置中猜测到有一个HTTP请求正在运行您的任务,因此它的功能与其他页面一样。在那些较早的版本中,您只需将&requesttimeout=900
添加到URL中,这将使服务器有15分钟的时间来处理该任务。
在更高版本中,他们意识到此URL参数存在安全风险,但他们需要一种方法来允许开发人员声明单个HTTP请求应仍比在ColdFusion Administrator中设置的默认页面超时花费更长的时间。因此他们将其从URL参数移到了<cfsetting>
标记。
<cfsetting requesttimeout="900" />
您需要将cfsetting标记放置在页面的顶部,而不是将其放置在循环中,因为它是从请求开始重置总允许时间,而不仅仅是从最后一个cfsetting标记开始。本·纳德尔(Ben Nadel)在这里写了一篇关于此的博客文章:http://www.bennadel.com/blog/626-CFSetting-RequestTimeout-Updates-Timeouts-It-Does-Not-Set-Them.htm
我不确定请求超时是否有上限。我确实知道,在过去,当我执行了一个长期运行的任务时,服务器逐渐变慢,在某些情况下直到崩溃为止。我不确定我是否期望重新索引Solr集合会严重降低性能,我认为我的任务正在做其他事情,这些事情可能会占用内存。无论如何,如果遇到该问题,您可能需要针对每个集合将其划分为单独的任务,只需确保任务之间有足够的时间来允许每个任务在下一个任务开始之前完成。
编辑:糟糕!我不知道如何在原始问题中错过
cfsetting
标记。天哪!无论如何,当您通过CF Administrator执行计划的任务时,它将执行cfhttp
请求以执行任务。这是正常执行计划任务的方式,我怀疑是这样,因此任务可以在您自己的应用程序范围内执行,但结果是有两个单独的请求在执行。我不认为CFIDE页面中有一个cfsetting
标记,但是我怀疑一个人可以添加一个,如果他们想让该页面更长以等待任务完成。编辑:好的,如果您想在CFIDE中添加
cfsetting
,则必须首先解密模板,然后添加一行代码...这可能会使服务器的保修失效,但可能并不危险。 ;)有关解密模板的信息,请参见:Can I get the source of a hacked Coldfusion template?-和要编辑的模板为/CFIDE/administrator/scheduler/scheduletasks.cfm
。