このタグは、CFFiddle ではサポートされていません。
説明
ColdFusion スケジューリングエンジンへのプログラムインターフェイスを提供します。ページ出力をスタティックな HTML ページに書き出すオプションとともに、スケジューリングした間隔で CFML ページを実行できます。この機能を利用すると、データベーストランザクションが実行されてページにデータが挿入されるのを待つことなく、レポートなどのデータをパブリッシュするページをスケジューリングすることができます。
ColdFusion では、タスクのイベントハンドラーメソッドの呼び出し時に、Application.cfc のメソッドは呼び出されません。
カテゴリ
シンタックス
<cfschedule action = "create|modify|run|update|pause|resume|delete|pauseall|resumeall|list" task = "task name" endDate = "date" endTime = "time" file = "filename" interval = "seconds" operation = "HTTPRequest" password = "password" path = "path to file" port = "port number" proxyPassword = "password" proxyPort = "port number" proxyServer = "host name" proxyUser = "user name" publish = "yes|no" resolveURL = "yes|no" isDaily = "yes|no" overwrite = "yes|no" startDate = "date" startTime = "time" url = "URL" username = "user name" group="group1" oncomplete="how to handle exception" eventhandler="path_to_event_handler" onException="refire|pause|invokeHandler" cronTime="time" repeat="number" priority="integer" exclude="date|date_range|comma-separated_dates" onMisfire = "" cluster="yes|no mode="server|application" retryCount="number"> または <cfschedule action="create" task = "task name"> または <cfschedule action = "modify" task = "task name"> または <cfschedule action = "delete" task = "task name"> または <cfschedule action = "run" task = "task name"> または <cfschedule action = "pauseAll" group=groupname> または <cfschedule action = "pauseAll"> または <cfschedule action = "resumeAll" mode = "server|application"> または <cfschedule action = "resumeAll" group=groupname> または <cfschedule action = "resumeAll"> または <cfschedule action = "list" mode = "server|application" result = "res">
このタグの属性は attributeCollection 属性で指定でき、その値は構造体になります。attributeCollection 属性で構造体の名前を指定し、タグの属性名を構造体のキーとして使用します。
関連項目
履歴
ColdFusion(2018 リリース)アップデート 2:create および modify アクションが導入されました。
ColdFusion(2018 リリース):属性 requestimeout は削除されました。
また、2018 リリースでは、cfschedule action=pauseall と resumeall で group または mode が不要になりました。
以下に例を挙げます。
app1 から <cfschedule action="pauseall" を実行する場合、app1 のサーバータスクおよびアプリケーションタスクはすべて一時停止されます。
app2 のタスクについては、pauseall/resumeall は実行されません。
ただし、アプリケーションの境界はまだ存在します。app1 では app2 のタスクについて pauseall/resumeall は実行できず、その逆もまた同様です。
しかし、どのアプリケーションでも、すべてのサーバーレベルのタスクについて pauseall/resumeall を実行することができます。
さらに、fire_now 属性の名前が、ColdFusion の 2018 リリースでは firenow に変更されました。
ColdFusion(2016 リリース)アップデート 8: アンダースコアを含んだ次の列が出力から削除されます。
- LAST_FIRE
- CHAINED_TASK
- REMAINING_COUNT
- RESOLVE_URL
- RETRY_COUNT
- PROXY_SERVER
- PROXY_PORT
- PROXY_USER
ColdFusion 10:list、pauseall、resumeall の各アクションが追加されました。また、group、onComplete、eventHandler、onException、cronTime、repeat、result、priority、exclude、onMisfire、cluster、mode、isDaily、overwrite および retryCount の各属性が追加されました。
ColdFusion MX 6.1:間隔の計算方法が変更されました。日の長さに標準時と夏時間の切り替えが反映されるようになりました。月の長さは、4 週間ではなくカレンダーの月の長さになりました。スケジューラで閏年を正しく処理できるようになりました。
ColdFusion Administrator でドライバーとしてその他を使用して登録されたデータベースを使用している場合は、<cfinstance>/lib/quartz にある quartz_cluster.properties ファイルに次の 2 つのプロパティを追加する必要があります。
- org.quartz.dataSource.<datasourcename>.connectionProvider.class=coldfusion.scheduling.ConnectionProviderImpl
- org.quartz.jobStore.dataSource=<datasourcename>
<datasourcename> は、ColdFusion Administrator で登録されたデータソースの名前に置き換えます。
また、データソースを ColdFusion に登録する際は、ドライバー名を必ず MySQL/Microsoft SQL Server/Oracle かその他のどちらかにしてください。
属性
ColdFusion では、タスクのイベントハンドラーメソッドの呼び出し時に、Application.cfc のメソッドは呼び出されません。
使用方法
ColdFusion のタスクをスケジューリングするには、このタグと ColdFusion Administrator の「スケジュールされたタスク」ページを使用します。このタグを使用して追加または変更したタスクは Administrator で表示できます。Administrator の「サンドボックス/リソースセキュリティ」ページで、このタグを無効にすることができます。このタグの成功または失敗のステータスは、cf_root/ cfusion /logs ディレクトリ(または、ColdFusion Enterprise インスタンスマネージャで作成した別のインスタンスの logs ディレクトリ)にある schedule.log ファイルに書き込まれます。
タスクを作成するときに、実行する ColdFusion ページの URL、実行の日付、時刻、頻度、およびタスク出力を HTML ファイルにパブリッシュするかどうかを指定します。出力をパブリッシュする場合は、出力ファイルのパスとファイルを指定します。
毎日、指定された開始時間と終了時間(午後 12 時から 4 時までなど)および間隔(1 分ごとなど)で実行するようスケジュールされているタスクがある場合は、次の方法で Administrator からタスクを作成することができます。
ColdFusion Administrator で、サーバーの設定/スケジュールされたタスクをクリックし、新規タスクのスケジューリングをクリックします。
夜間に実行するタスクを作成する場合は、 cron 式を記述できます。例えば、毎月 1 日に、午後 6 時から午前 4 時までの間タスクを実行する必要がある場合は、次の式を使用します。
0 0 18-4 1 * ? *
開始時刻に過去の時刻を指定して、ジョブを 1 回実行するようにスケジュールした場合、そのタスクがまだ実行されていなければ、直ちに誤実行されます。
開始時刻に過去の時刻を指定して、繰り返し発生するジョブをスケジュールすると、ジョブは次に訪れる最も近い指定時刻に実行されます。スケジューラ設定ファイル(cf_root\lib\neo- cron . xml )には、スケジュールされたすべてのイベント(クラスタ化されたタスクは除く)が個別のエントリとして書き込まれます。
また、 cfschedule タグは、クエリ内の次の結果変数も返します。result 属性で指定した名前を接頭辞とするこれらの変数にアクセスできます。例えば、result 属性に myResult という名前を割り当てると、#myResult.status[2]# にアクセスすることで 2 番目に取得したタスクのステータスを取得できます。result 属性は、複数のページから同時に呼び出される可能性がある関数または CFC(あるいはこれら両方)について、一方の呼び出しの結果が他方の呼び出しの結果を上書きしないようにするための方法を提供します。
変数名 | 説明 |
result_name.chainedtask | 連鎖タスクかどうかを示します |
result_name.clustered | タスクがクラスタモードで実行されているかどうかを示します |
result_name.crontime | タスクの cron 開始時刻を示します |
result_name.enddate | タスクの終了日を示します |
result_name.endtime | タスクの終了時刻を示します |
result_name.eventhandler | タスクに関連付けられているイベントハンドラーを示します |
result_name.exclude | タスクから除外されている日付または時刻の範囲を示します |
result_name.file | タスクのパブリッシュされた出力を保管するファイルの名前を示します |
result_name.group | タスクが属するグループを示します |
result_name.interval | タスクをスケジューリングする間隔を示します |
result_name.lastfire | 最後にタスクを実行した時刻を示します |
result_name.mode | タスクがサーバー固有かアプリケーション固有かを示します |
result_name.oncomplete | タスクが完了した後のアクションを示します連鎖タスクで使用します |
result_name.onexception | タスクがエラー終了したときのアクションを示します |
result_name.onmisfire | タスクが誤実行されたときのアクションを示します |
result_name.overwrite | タスクを実行するたびに出力ファイルを上書きするかどうかを示します |
result_name.path | タスク出力が保管されるパブリッシュ済みファイルの場所を示します |
result_name.priority | タスクの優先順位を示します |
result_name.proxyport | プロキシサーバーのポート番号を示します |
result_name.proxyserver | プロキシサーバーのホスト名または IP アドレスを示します |
result_name.proxyuser | プロキシサーバーに提供されるユーザー名を示します |
result_name.publish | タスクの結果をファイルに保存するかどうかを示します |
result_name.remainingcount | タスクの未実行の回数を示します |
result_name.repeat | タスクの繰り返し回数を示します |
result_name.resolveurl | タスクの結果ページのリンクを絶対参照にするかどうかを示します |
result_name.retrycount | タスクの試行回数を示します |
result_name.startdate | タスクが最初にスケジュールされた日付を示します |
result_name.starttime | タスクの実行がスケジュールされている時刻を示します |
result_name.status | タスクのステータスを示します |
result_name.task | タスクの名前を示します |
result_name.timeout | タスクのタイムアウト時間を秒単位で示します |
result_name.url | 実行されたページの URL を示します |
result_name.username | ユーザー名を示します(ページの URL が保護されている場合) |
例 1
<! --- この読み取り専用サンプルではタスクをスケジュールしています。この例を実行するには、コードを囲むコメントを削除し、startDate、startTime、url、file、path の各属性を適切な値に変更します。---> <cfschedule action = "update" task = "TaskName" operation = "HTTPRequest" url = "http://127.0.0.1/playpen/history.cfm" startDate = "8/17/09" startTime = "12:25 PM" interval = "3600" resolveURL = "Yes" publish = "Yes" file = "sample.html" path = "c:\inetpub\wwwroot\playpen" >
例 2
handler.cfc
component implements="cfide.scheduler.ITaskEventHandler" { public boolean function onTaskStart(Struct context){ myvar="onTaskStart"; cffile (action="append", file="#Expandpath('./')#log.txt", output="fireInstancedId:#context.fireinstanceID#, myvar: #myvar#<br>"); return true; } public void function Execute(Struct context){ myvar= myvar & "Execute"; cffile (action="append", file="#Expandpath('./')#log.txt", output="fireInstancedId:#context.fireinstanceID#, myvar: #myvar#<br>"); } public void function onTaskEnd(Struct context){ myvar=myvar & "onMisfire"; cffile (action="append", file="#Expandpath('./')#log.txt", output="fireInstancedId:#context.fireinstanceID#, myvar: #myvar#<br>"); } public void function onMisfire(Struct context){ // FireInstance-Id は onMisfire には渡されない } public void function onError( Struct context){ myvar= myvar & "onError"; cffile (action="append", file="#Expandpath('./')#log.txt", output="fireInstancedId:#context.fireinstanceID#,myvar: #myvar#<br>"); } }
index.cfm
<! --- タスクの作成 ---> <cfschedule action="update" task="fireInstanceEx" eventhandler="schedulerTest.handler" interval="once"> ログファイルの読み取り<br/> <cfset sleep(18000)> <cffile action="read" file="#Expandpath('./')#log.txt" variable="res" > <cfoutput>#res#</cfoutput>
例 3
<cfscript> cfschedule (action="create", task="myTask", group="bugTesting" ,mode="Server", url="http://google.com", startDate="24/12/2017", startTime="12:00 AM", interval ="daily") cfschedule(action="modify", task="myTask",group="bugTesting" ,interval="3600",startDate="25/12/2017", startTime="1:00 AM", publish="yes",path="#ExpandPath('./')#",file="task.log") cfschedule(action="list",task="myTask1",group="bugTesting",result="taskQuery") writeoutput ("Name:" & #taskQuery.task# & " Group:" & #taskQuery.task# & " mode:" & #taskQuery.mode# & " url:" & #taskQuery.Url# & " startDate:" & #taskQuery.startDate# & " startTime:" & #taskQuery.startTime# & " interval:" & #taskQuery.interval# & " publish:" & #taskQuery.publish# & " file:" & #taskQuery.file# & "<br>"); </cfscript>