9

30 秒間隔で実行したい CFC メソッドがあります。ただし、問題は、ColdFusion では 60 秒以下の間隔で実行されるタスクをスケジュールできないことです。これをどのように達成できるか(そしてすべきか)について誰か提案がありますか?

「スクリプトが 30 秒以上実行されるとどうなるか」という質問、またはそのような質問に先制的に答えるために、私はすでにすべてのことを検討しており、それは問題ではありません。

Windows Server 2003 (IIS6) で ColdFusion 8.0.1 (ホットフィックス 4 を適用) を実行しています。ちなみに、ColdFusion の JVM として Java 1.6u21 を使用しています。

前もって感謝します。

4

6 に答える 6

13

これを行う唯一の方法は、スケジュールされたタスクのファイルを手動で編集することです。

そう:

  1. たとえば、5 分の間隔でスケジュールされたタスクを作成します。
  2. CF インストールのディレクトリーで呼び出さneo-cron.xmlれたファイルを開きます。最初にバックアップすることlibをお勧めします。
  3. スケジュールされたタスクの名前を検索します。これは XML の大きな塊なので、フォーマットして XML エディターで検索することをお勧めします。
  4. タスク名の少し後に、次のように表示されます<var name="interval"><string>300</string></var>。これは、タスクが実行される間の秒数です。ここでは秒単位なので、手動で 30 に調整し、ファイルを保存して閉じることができます。

これは CF 管理画面では 1 分として表示されますが、30 秒ごとに実行する必要があります。必要に応じてログを追加して証明してください。

CF admin を使用して他のスケジュールされたタスクを編集しても、手動での変更は影響を受けませんが、手動で調整した実際のタスクを編集すると、変更が上書きされます。

それが役立つことを願っています!

于 2010-07-28T16:08:19.070 に答える
6

サーバーWinまたはnixでcurlを使用してタスクをスケジュールできます。

于 2010-07-28T15:05:02.150 に答える
2

タスクを 1 分間に 2 回実行することに本当に関心がありますか?それとも、変更されたデータまたは新しいデータを検出する際の待ち時間を短縮したいだけですか? 後者の場合は、CF イベント ゲートウェイを使用して、いつ実行するかを正確に検出できます。この場合、データを無限にポーリングするだけでなく、何らかのイベントですぐにその CFC メソッドを実行するため、サーバーでのチャーンがはるかに少なくなります。

于 2010-07-28T15:22:15.320 に答える
1

これは古い質問であることはわかっていますが、同様の解決策が必要だったため(私にとっては10秒間隔でした)、これらの回答はどれも機能しなかったため、ここに戻ってきました。今日、誰かが同様のバインドに陥った場合に備えて投稿する方法をついに見つけました。

CF 9.0.1を使用しているため、答えとしてリストされているxml変更方法を使用できないことがわかりました.xmlは、変更した直後に元に戻ります。

cURL を調べてみたところ、cURL を使用してプロセスを呼び出すことはできましたが、Windows スケジューラを 1 分未満の間隔で実行することもできませんでした。次に、Windowsスケジューラをより短い間隔で実行する方法を探しているときに(この時点でCFをだますことはできないと思ったので)、experts-exchangeで行われた提案に出くわしました(URLオフを思い出せません今すぐ手)。

それに基づいて、このアイデアを使用してテストをセットアップしました。スケジュールするプログラムを呼び出すプログラムの別のレイヤーを追加します。このレイヤーをスリープ状態でループさせ、1 分以上の間隔でスケジュールします。最終的に、「発信者」を 2 分ごとに呼び出す CF スケジュール タスクに行きました。その「発信者」には、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>

デバッグに使用されるロギング 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>

テストでは、10 分間のウィンドウにスケジュールされたときに次のログ出力が得られました。

情報 02/26/2013 15:29:00 F1E76BAE-C29A-208A-7B14339FD6B9B8D5 __ 開始情報 02/26/2013 15:29:00 F1E76BAE-C29A-208A-7B14339FD6B9B8D5 __ 1 - 書き込み情報 02/121/5 29:30 F1E76BAE-C29A-208A-7B14339FD6B9B8D5 __ 2 - 書面による情報 02/26/2013 15:30:00 F1E76BAE-C29A-208A-7B14339FD6B9B8D5 __ 3 - 書面による情報 02/26/2013 F1E7A-C07:3 -208A-7B14339FD6B9B8D5 __ 4-書かれた情報__ 開始情報 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:F1F9B64D-C29A-208A-73CEACA04A02F544 __ 4 - 書面による情報-73CEACA04A02F544 __ 完了 - 時間: 90053 情報 02/26/2013 15:33:00 F20C0329-C29A-208A-79C8C0D4C1E1FDFF __ 開始情報 02/26/2013 15:33:00 F20C0329-C29A-208A-79お知らせ 02/26/2013 15:33:30 F20C0329-C29A-208A-79C8C0D4C1E1FDFF __ 2 - 書面によるお知らせ15:34:30 F20C0329-C29A-208A-79C8C0D4C1E1FDFF __ 4 - 書かれた情報 02/26/2013 15:34:30 F20C0329-C29A-208A-79C8C0D4C1E1FDFF __ 完了 - 時間: 90054 情報 02/3: 15:26:203500 F21E5001-C29A-208A-744291B2817D7702 __情報02/26/2013 15:35:00 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-744291B2817D __ 2 - 書面による情報 40 - 書面による情報 770 /26/2013 15:36:30 F21E5001-C29A-208A-744291B2817D7702 __ 完了 - 時間: 90029 情報 02/26/2013 15:37:00 F2309E2F-C29A-208A-7D6A5A2D1CA7D9EF __2 開始 6 情報/201/3 37:00 F2309E2F-C29A-208A-7D6A5A2D1CA7D9EF __ 1 - 書面による情報 02/26/2013 15:37:30 F2309E2F-C29A-208A-7D6A5A2D1CA7D9EF __ 2 - 書面による情報 02/26/2013:02C-09E F209E-38 -208A-7D6A5A2D1CA7D9EF __ 3 - 書面による情報 2013 年 2 月 26 日 15:38:30 F2309E2F-C29A-208A-7D6A5A2D1CA7D9EF __ 4 - 書面による情報 02/26/2013 15:38:30 F2309E2F-C29A-208A-7D6A5A2D1CA7D9EF __ 完了 - 時間: 90013 情報 02/26/2012: 02-49F 34A-15: -208A-7952DA25AF0C446D __ 開始情報 02/26/2013 15:39:00 F242ED34-C29A-208A-7952DA25AF0C446D __ 1 - 書面による情報 02/26/2013 15:39:30 F242ED34-C29A-208A-208A-504情報 02/26/2013 15:40:00 F242ED34-C29A-208A-7952DA25AF0C446D __ 3 - 書面による情報 02/26/2013 15:40:30 F242ED34-C29A-208A-7952DA25AF0C446D __ 4 - 書面による情報/ 201/3 15:40:30 F242ED34-C29A-208A-7952DA25AF0C446D __ 完了 - 時間: 9004500 F242ED34-C29A-208A-7952DA25AF0C446D __情報02/26/2013 15:39:00 F242ED34-C29A-208A-7952DA25AF0C446D __ 1-書面による情報__ 2 - 書面による情報 02/26/2013 15:40:00 F242ED34-C29A-208A-7952DA25AF0C446D __ 3 - 書面による情報 02/26/2013 15:40:30 F242ED34-C29A-208A-7952DA25AF0C446D /26/2013 15:40:30 F242ED34-C29A-208A-7952DA25AF0C446D __ 完了 - 時間: 9004500 F242ED34-C29A-208A-7952DA25AF0C446D __情報02/26/2013 15:39:00 F242ED34-C29A-208A-7952DA25AF0C446D __ 1-書面による情報__ 2 - 書面による情報 02/26/2013 15:40:00 F242ED34-C29A-208A-7952DA25AF0C446D __ 3 - 書面による情報 02/26/2013 15:40:30 F242ED34-C29A-208A-7952DA25AF0C446D /26/2013 15:40:30 F242ED34-C29A-208A-7952DA25AF0C446D __ 完了 - 時間: 9004530 F242ED34-C29A-208A-7952DA25AF0C446D __ 4 - 書面による情報 02/26/2013 15:40:30 F242ED34-C29A-208A-7952DA25AF0C446D __ 完了 - 時間: 9004530 F242ED34-C29A-208A-7952DA25AF0C446D __ 4 - 書面による情報 02/26/2013 15:40:30 F242ED34-C29A-208A-7952DA25AF0C446D __ 完了 - 時間: 90045

これが、他の答えを得ることができなかった他の人に役立つことを願っています!

于 2013-02-26T21:19:14.077 に答える
0

<cfschedule>探しているタグですが、2 つの部分からなるタグであることに注意してください。それはこのように動作します:

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

于 2012-07-06T18:25:17.183 に答える