我有一个CFC方法,我希望以30秒的间隔运行。但是,问题是ColdFusion不会让我安排以60秒或更短的间隔运行的任务。有没有人对我如何能够(并且应该)实现这一目标有所建议?
要抢先回答“当您的脚本运行时间超过30秒时会发生什么”或“此类任何其他问题”的问题,我已经考虑了所有这些问题,而且不是问题。
我在Windows Server 2003(IIS6)上运行ColdFusion 8.0.1(带有修补程序4)。作为旁注,我使用Java 1.6u21作为ColdFusion的JVM。
提前致谢。
答案 0 :(得分:13)
执行此操作的唯一方法是通过手动编辑计划任务的文件。
所以:
neo-cron.xml
目录中打开名为lib
的文件。您可能希望先备份。<var name="interval"><string>300</string></var>
。这是任务运行之间的秒数。这是几秒钟,所以您可以手动将其调整为30,然后保存文件并关闭它。 这仍然会在CF管理员中显示为1分钟,但它应该每30秒运行一次 - 如果您愿意,请添加日志以证明它!
如果您使用CF admin编辑任何其他计划任务,那么手动更改将不受影响,但如果您编辑实际任务,则手动调整它将覆盖您的更改。
希望有所帮助!
答案 1 :(得分:6)
您可以使用curl并在服务器Win或nix上安排任务。
答案 2 :(得分:2)
您真的对每分钟运行两次的任务感兴趣,还是只是想减少检测更改或新数据的延迟?如果是后者,您可以查看使用CF事件网关来准确检测何时运行。如果是这种情况,您的服务器上的流失率会大大减少,因为您在某些事件后立即运行该CFC方法,而不仅仅是无休止地轮询数据。
答案 3 :(得分:1)
我知道这是一个古老的问题,但我一直在这里结束,因为我需要一个类似的解决方案(仅对我而言是10秒间隔),这些答案都没有奏效。我终于在今天找到了一种方式,我想我会发布以防任何人最终陷入类似的约束。
我发现我无法使用列出的xml修改方法作为答案,因为我们使用的是CF 9.0.1,并且在我更改之后xml几乎会立即恢复。
我试着查看cURL,并发现虽然我可以使用cURL来调用该进程,但我也无法让Windows调度程序在不到一分钟的时间内运行。然后在寻找一种方法让Windows调度程序以较小的间隔运行(因为我觉得我此时无法欺骗CF),我偶然发现了一个关于专家交换的建议(我不记得关闭了网址)现在手。)
基于此,我使用这个想法设置了一个测试:添加另一层调用你想要安排的程序的程序。让这个图层循环休眠,并安排一段时间超过一分钟。最终我去了一个CF计划任务,每隔2分钟调用一次“调用者”,并且“调用者”有一个每隔X秒睡一次的循环。
以下是我用于测试的代码,格式化为回答提问者的30秒间隔。我使用了一个side log-management cfc以我可以保存和重新访问的方式输出调试。
计划每2分钟运行一次的测试文件:
<cfsetting requestTimeOut = "120000">
<cfscript>
/* Get starting count to keep track of overall running time */
Start = GetTickCount();
/* Set an ID for this process so I know */
thisProcess = CreateUUID();
counter = 0;
/* Set up a log-file-handler object.
* I will use the log lines to keep track of this process
* and whether or not it steps on itself.
* */
LogWriter = CreateObject('component','log.LogMgr').init('C:\Logs\');
LogFile = 'Test\30SecondTestLog';
LogWriter.WriteToLog('Information',LogFile,'#thisProcess# __ Started');
</cfscript>
<cftry>
<cfloop condition="Counter LT 4">
<!--- Output here is if you want to run it manually --->
<br /><cfdump var="#counter#">
<!--- Here you could put a cfhttp or similar trigger.
In my test I just used an update to a test DB table.
The catch here is that you don't want it to take too
long to get to the next steps, so you want to avoid
a long-running process that has to return something.
--->
<cfquery datasource="Marge" name="update">
Update test..testCount
Set CountField = CountField + 1
</cfquery>
<cfscript>
counter += 1;
LogWriter.WriteToLog('Information',LogFile,'#thisProcess# __ #counter# - Written');
/* Important part! Here is where the 30-second delay
* happens. However, we don't want to dally if this is
* the last time running it.
* */
if(counter NEQ 4){ sleep(30000); }
</cfscript>
</cfloop>
<!--- Time to output finishing details --->
<br />Done. <br />
<cfset End = GetTickCount()>
<cfdump var="#End - Start#">
<cfset LogWriter.WriteToLog('Information',LogFile,'#thisProcess# __ Done - Time: #End - Start#')>
<cfcatch type="any">
<cfset LogWriter.WriteToLog('Error',LogFile,'#thisProcess# __ #counter# - #cfcatch.message#')>
</cfcatch>
</cftry>
用于调试的日志记录cfc:
<cfscript>
variables.LogHome = '';
</cfscript>
<cffunction name="init" raturntype="LogMgr">
<cfargument name="LogHome" type="string">
<cfset variables.LogHome = arguments.LogHome>
<cfreturn this>
</cffunction>
<!--- I wanted to use WriteLog, but that function name is already used in core CF --->
<cffunction name="WriteToLog" returntype="void" hint="writes to a log file.">
<cfargument name="LogType" type="string" hint="Based off cflog, expects severity level: Information, Warning, Error, or Fatal">
<cfargument name="LogPath" type="string" hint="Path and file from log root">
<cfargument name="LogString" type="string" hint="String to output in log">
<cfscript>
theFile = variables.LogHome & '\' & arguments.LogPath & '.log';
theString = arguments.LogType & chr(9) & DateFormat(Now(),'mm/dd/yyyy')& ' ' & TimeFormat(Now(),'HH:mm:ss');
theString &= ' ' & arguments.LogString;
</cfscript>
<cfif FileExists(theFile)>
<cffile action="append"
file="#theFile#"
output="#theString#"
addnewline="yes">
<cfelse>
<cffile action="write"
file="#theFile#"
output="#theString#"
addnewline="yes">
</cfif>
</cffunction>
</cfcomponent>
测试在计划十分钟窗口时给出了此日志输出:
资讯02/26/2013 15:29:00 F1E76BAE-C29A-208A-7B14339FD6B9B8D5 __开始 信息02/26/2013 15:29:00 F1E76BAE-C29A-208A-7B14339FD6B9B8D5 __ 1 - 书面 信息02/26/2013 15:29:30 F1E76BAE-C29A-208A-7B14339FD6B9B8D5 __ 2 - 书面 信息02/26/2013 15:30:00 F1E76BAE-C29A-208A-7B14339FD6B9B8D5 __ 3 - 书面 信息02/26/2013 15:30:30 F1E76BAE-C29A-208A-7B14339FD6B9B8D5 __ 4 - 书面 信息02/26/2013 15:30:30 F1E76BAE-C29A-208A-7B14339FD6B9B8D5 __完成 - 时间:90123 信息02/26/2013 15:31:00 F1F9B64D-C29A-208A-73CEACA04A02F544 __开始 信息02/26/2013 15:31:00 F1F9B64D-C29A-208A-73CEACA04A02F544 __ 1 - 书面 信息02/26/2013 15:31:30 F1F9B64D-C29A-208A-73CEACA04A02F544 __ 2 - 书面 信息02/26/2013 15:32:00 F1F9B64D-C29A-208A-73CEACA04A02F544 __ 3 - 书面 信息02/26/2013 15:32:30 F1F9B64D-C29A-208A-73CEACA04A02F544 __ 4 - 书面 信息02/26/2013 15:32:30 F1F9B64D-C29A-208A-73CEACA04A02F544 __完成 - 时间:90053 信息02/26/2013 15:33:00 F20C0329-C29A-208A-79C8C0D4C1E1FDFF __开始 信息02/26/2013 15:33:00 F20C0329-C29A-208A-79C8C0D4C1E1FDFF __ 1 - 书面 信息02/26/2013 15:33:30 F20C0329-C29A-208A-79C8C0D4C1E1FDFF __ 2 - 书面 信息02/26/2013 15:34:00 F20C0329-C29A-208A-79C8C0D4C1E1FDFF __ 3 - 书面 信息02/26/2013 15:34:30 F20C0329-C29A-208A-79C8C0D4C1E1FDFF __ 4 - 书面 信息02/26/2013 15:34:30 F20C0329-C29A-208A-79C8C0D4C1E1FDFF __完成 - 时间:90054 信息02/26/2013 15:35:00 F21E5001-C29A-208A-744291B2817D7702 __开始 信息02/26/2013 15:35:00 F21E5001-C29A-208A-744291B2817D7702 __ 1 - 书面 信息02/26/2013 15:35:30 F21E5001-C29A-208A-744291B2817D7702 __ 2 - 书面 信息02/26/2013 15:36:00 F21E5001-C29A-208A-744291B2817D7702 __ 3 - 书面 信息02/26/2013 15:36:30 F21E5001-C29A-208A-744291B2817D7702 __ 4 - 书面 信息02/26/2013 15:36:30 F21E5001-C29A-208A-744291B2817D7702 __完成 - 时间:90029 信息02/26/2013 15:37:00 F2309E2F-C29A-208A-7D6A5A2D1CA7D9EF __已开始 信息02/26/2013 15:37:00 F2309E2F-C29A-208A-7D6A5A2D1CA7D9EF __ 1 - 书面 信息02/26/2013 15:37:30 F2309E2F-C29A-208A-7D6A5A2D1CA7D9EF __ 2 - 书面 信息02/26/2013 15:38:00 F2309E2F-C29A-208A-7D6A5A2D1CA7D9EF __ 3 - 书面 信息02/26/2013 15:38:30 F2309E2F-C29A-208A-7D6A5A2D1CA7D9EF __ 4 - 书面 信息02/26/2013 15:38:30 F2309E2F-C29A-208A-7D6A5A2D1CA7D9EF __完成 - 时间:90013 信息02/26/2013 15:39:00 F242ED34-C29A-208A-7952DA25AF0C446D __开始 信息02/26/2013 15:39:00 F242ED34-C29A-208A-7952DA25AF0C446D __ 1 - 书面 信息02/26/2013 15:39:30 F242ED34-C29A-208A-7952DA25AF0C446D __ 2 - 书面 信息02/26/2013 15:40:00 F242ED34-C29A-208A-7952DA25AF0C446D __ 3 - 书面 信息02/26/2013 15:40:30 F242ED34-C29A-208A-7952DA25AF0C446D __ 4 - 书面 信息02/26/2013 15:40:30 F242ED34-C29A-208A-7952DA25AF0C446D __完成 - 时间:90045
我希望这可以帮助其他任何无法获得其他答案的人!
答案 4 :(得分:1)
Ciaran Archer对答案的评论不够,所以我会把它放在这里:
正如Kodora指出的那样,使用ColdFusion 9.0.1(在我的情况下为9.0.1.274733),更改将不立即生效,似乎需要重新启动服务。但是,在重新启动时,您对neo-cron.xml文件的更改将丢失!
要解决此问题,请务必在之前停止ColdFusion服务对文件进行更改。服务停止后,您可以进行调整,保存文件并再次启动服务。
值得注意的是,在Windows Server 2008 R2(可能更高版本)上,您可能需要以管理员身份打开记事本,然后在记事本中打开neo-cron.xml文件。否则,您可能无法将更改保存到文件中(由于UAC,我相信)。
答案 5 :(得分:0)
<cfschedule>
您要查找的标记,但要注意它是两部分标记。它的工作原理如下:
<!--- creates/updates the scheduled task you are going to run --->
<cfschedule action="update" task="testing" interval="seconds" operation="HTTPRequest" startdate="7/6/2012" starttime="11:06 AM" URL="yoursite.com">
<!--- runs the task you just updated (the part that makes the task repeat on your specified interval instead. If you do not include this, the task will run only once as it did in @sergii's case--->
<cfschedule action="run" task="testing">
文档:http://livedocs.adobe.com/coldfusion/8/htmldocs/help.html?content=Tags_r-s_11.html