所以我很擅长使用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>
答案 0 :(得分:1)
在早期版本的ColdFusion中,有一个URL参数可以在任何HTTP请求上传递,以更改所请求页面的服务器超时。您可能已经从计划任务配置中猜到,有一个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
标记。 D'哦!无论如何,当您通过CF管理员执行计划任务时,它会执行cfhttp
请求来执行任务。这是正常执行计划任务的方式,我怀疑这是任务可以在您自己的应用程序范围内执行,但结果是执行了两个单独的请求。我不认为CFIDE页面中有cfsetting
标签,但我怀疑如果他们想让该页面更长时间等待任务完成,则可以添加一个标签。
编辑:好的,如果您想在CFIDE中添加cfsetting
,首先必须解密模板,然后添加一行代码...这可能会使您在服务器上的保修失效,但可能并不危险。 ;)有关解密模板的信息,请参阅:Can I get the source of a hacked Coldfusion template? - 要编辑的模板为/CFIDE/administrator/scheduler/scheduletasks.cfm
。