Как запустить запланированное задание ColdFusion с интервалом <60 секунд? - PullRequest
9 голосов
/ 28 июля 2010

У меня есть метод CFC, который я хотел бы запустить с интервалом в 30 секунд. Однако проблема в том, что ColdFusion не позволяет мне планировать задачу, которая выполняется с интервалом 60 секунд или меньше. У кого-нибудь есть предложение о том, как я могу (и должен) сделать это?

Для того, чтобы превентивно ответить на вопрос «Что происходит, когда ваш скрипт выполняется дольше 30 секунд» или на любой другой подобный вопрос, я уже все это рассмотрел, и это не проблема.

Я использую ColdFusion 8.0.1 (с исправлением 4) в Windows Server 2003 (IIS6). В качестве примечания, я использую Java 1.6u21 в качестве JVM для ColdFusion.

Заранее спасибо.

Ответы [ 6 ]

13 голосов
/ 28 июля 2010

Единственный способ сделать это с помощью ручного редактирования файла для ваших запланированных задач.

Итак:

  1. Создайте запланированное задание с интервалом, скажем, 5 минут.
  2. Откройте файл с именем neo-cron.xml в каталоге lib вашегоCF установить.Возможно, вы захотите сначала создать резервную копию .
  3. Найдите имя запланированного задания.Это большой кусок XML, поэтому вы можете отформатировать его и искать в редакторе XML.
  4. Немного после названия задачи вы должны увидеть что-то вроде этого: <var name="interval"><string>300</string></var>.Это количество секунд между выполнением задачи.Это в секундах, поэтому вы можете вручную установить 30, а затем сохранить файл и закрыть его.

Это все равно будет отображаться как 1 минута в администраторе CF, но оно должно запускаться каждые 30 секунд - добавьте ведение журнала, чтобы доказать это, если хотите!

Не так, если вы редактируете любое другоезапланированное задание с использованием администратора CF ваши изменения не будут затронуты вручную, но если вы отредактируете реальное задание, которое вы откорректировали вручную, оно перезапишет ваши изменения.

Надеюсь, это поможет!

6 голосов
/ 28 июля 2010

Вы можете использовать curl и запланировать задачу на сервере Win или nix.

2 голосов
/ 28 июля 2010

Вы действительно заинтересованы в том, чтобы ваша задача выполнялась дважды в минуту, или вы просто хотите уменьшить задержку при обнаружении измененных или новых данных?Если это последнее, вы можете посмотреть, используя CF Event Gateways, чтобы точно определить, когда запускать.Если это так, у вас будет гораздо меньше оттока на вашем сервере, так как вы будете запускать этот метод CFC сразу после какого-то события, а не просто бесконечно запрашивать данные.

1 голос
/ 11 ноября 2013

Недостаточно представителей, чтобы прокомментировать ответ Ciaran Archer , поэтому я выложу его здесь:

Как указано Kodora , при использовании ColdFusion 9.0.1 (в моем случае 9.0.1.274733) изменение не вступит в силу немедленно и, по-видимому, требует перезапуска службы. Однако при перезапуске изменения в файле neo-cron.xml теряются!

Чтобы обойти это, просто остановите службу ColdFusion до того, как внесете изменения в файл. После остановки службы вы можете выполнить настройку, сохранить файл и снова запустить службу.

Вероятно, стоит отметить, что в Windows Server 2008 R2 (и, возможно, выше) вам может потребоваться открыть Блокнот как Администратор, а затем открыть файл neo-cron.xml из Блокнота. В противном случае вам может быть запрещено сохранять изменения в файле (из-за UAC, я полагаю).

1 голос
/ 27 февраля 2013

Я знаю, что это старый вопрос сейчас, но я продолжал возвращаться сюда, потому что мне нужно было подобное решение (только для меня это был 10-секундный интервал), и ни один из этих ответов не сработал.Сегодня я наконец-то нашел способ, который я решил опубликовать на тот случай, если кто-нибудь окажется в подобной привязке.

Я обнаружил, что не могу использовать метод модификации xml, указанный в качестве ответа, потому что мы 'Я использую CF 9.0.1, и xml будет возвращаться почти сразу после того, как я его изменил.

Я попытался просмотреть cURL и обнаружил, что, хотя я могу использовать cURL для вызова процесса, я не могу получить планировщик Windowsбежать с интервалом менее минуты, либо.Затем, ища способ заставить планировщик Windows работать с меньшими интервалами (так как я подумал, что не могу обмануть CF на этом этапе), я наткнулся на предложение, сделанное на обмене экспертами (я не могу вспомнить URL-адрес)рука).

Исходя из этого, я настроил тест, используя эту идею: добавьте еще один слой программы, который вызывает программу, которую вы хотите запланировать.Сделайте этот слой зацикливанием и запланируйте его на интервал, превышающий минуту.В конечном итоге я выбрал запланированную задачу CF, которая вызывает моего «вызывающего» каждые 2 минуты, и этот «вызывающий» имеет цикл, который спит каждые X секунд.

Ниже приведен код, который я использовал для тестов, отформатированный вответить на 30 секундный интервал спрашивающего.Я использовал сторонний 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>

Протокол ведения журнала, используемый для отладки:

<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>

Тест выдал этот вывод журнала, когда запланировано наокно продолжительностью десять минут:

Информация 26.02.2013 15:29:00 F1E76BAE-C29A-208A-7B14339FD6B9B8D5 __ Начато 26.02.2013 15:29:00 F1E76BAE-C29A-208A-7B14339FD6B9B8D5 __ 1 - Письменная информация 26.02.2013 15:29:30 F1E76BAE-C29A-208A-7B14339FD6B9B8D5 __ 2 - Письменная информация 26.02.2013 15:30:00 F1E76BAE-C29A-208A-7B14338FD6B930B6Информация 26.02.2013 15:30:30 F1E76BAE-C29A-208A-7B14339FD6B9B8D5 __ 4 - Письменная информация 26.02.2013 15:30:30 F1E76BAE-C29A-208A-7B14339FD6B9B8D5 __ Готово - время: 90123 Информация 02/26/ 2013 15:31:00 F1F9B64D-C29A-208A-73CEACA04A02F544 __ Начатый Информация 26.02.2013 15:31:00 F1F9B64D-C29A-208A-73CEACA04A02F544 __ 1 - Письменная информация 26.02.2013 15:31:30 F1F9B64D-C29A-208A-73CEACA04A02F544 __ 2 - Письменная информация 26.02.2013 15:32:00 F1F9B64D-C29A-208A-73CEACA04A02F544 __ 3 - Письменная информация 26.02.2013 15:32:30 F1F9B64D-C29A-208A-73CEACA04A02F544 __ 4 - Письменная информация 26.02.2013 15:32:30 F1F9B64D-C29A-208A-73CEACA04A02F544 __ Готово - Время: 90053 Информация 26.02.2013 15:33:00 F20C0329-C29A-208A-79C8C0D4C1E1FDFF __ Начато 26.02.2013 15:33:00 F20C0329-C29A-208A-79C8C0D4C1Eten 126.02.2013 15:33:30 F20C0329-C29A-208A-79C8C0D4C1E1FDFF __ 2 - Письменная информация 26.02.2013 15:34:00 F20C0329-C29A-208A-79C8C0D4C1E1FDFF __ 3 - Письменная информация 02/26/2013 15: 34: 30 F20C0329-C29A-208A-79C8C0D4C1E1FDFF __ 4 - Письменная информация 26.02.2013 15:34:30 F20C0329-C29A-208A-79C8C0D4C1E1FDFF __ Готово - Время: 90054 Информация 02/26/2013 15:35:00F21E5001-C29A-208A-744291B2817D7702 __. Начатая информация 26.02.2013 15:35:00 F21E5001-C29A-208A-744291B2817D7702 __ 1 - письменная информация 26.02.2013 15:35:30 F21E5001-C29A-208A-7442928229292 - Письменная информация 26.02.2013 15:36:00F21E5001-C29A-208A-744291B2817D7702 __ 3 - письменная информация 26.02.2013 15:36:30 F21E5001-C29A-208A-744291B2817D7702 __ 4 - письменная информация 26.02.2013 15:36:30 F21E5001-C29A-208A-744291B2817D7702 __ Готово - Время: 90029 Информация 26.02.2013 15:37:00 F2309E2F-C29A-208A-7D6A5A2D1CA7D9EF __ Начато 26.02.2013 15:37:00 F2309E2F-C29A-208A-7D6A5A2D1A1A1A1D1A1A1A1_ФФ 1A1111Информация 26.02.2013 15:37:30 F2309E2F-C29A-208A-7D6A5A2D1CA7D9EF __ 2 - Письменная информация 26.02.2013 15:38:00 F2309E2F-C29A-208A-7D6A5A2D1CA7D9EF __ 3 - Письменная информация 02/26/201315:38:30 F2309E2F-C29A-208A-7D6A5A2D1CA7D9EF __ 4 - Письменная информация 26.02.2013 15:38:30 F2309E2F-C29A-208A-7D6A5A2D1CA7D9EF __ Готово - Время: 90013 Информация 02/26/2013 15:39:00 F242ED34-C29A-208A-7952DA25AF0C446D __ Начато 26.02.2013 15:39:00 F242ED34-C29A-208A-7952DA25AF0C446D __ 1 - письменная информация 26.02.2013 15:39:30 F242ED34-C29A-208AF 7952256__ 2 - письменная информация 26.02.2013 15:40:00 F242ED34-C29A-208A-7952DA25AF0C446D __ 3 - письменная информация 26.02.2013 15:40:30 F242ED34-C29A-208A-7952DA25AF0C446D __ 4 - письменная информация 02/ 26/2013 15:40:30 F242ED34-C29A-208A-7952DA25AF0C446D __ Готово - Время: 90045

Надеюсь, это может помочь всем, кто не смог получить ответы на другие вопросы!

0 голосов
/ 06 июля 2012

<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

...