CF2021u1, CF2018u11でのスケジュールタスクのタイムアウト設定について

スケジュールタスクのタイムアウト設定については、複雑な問題があります。古いColdFusionは、URL変数の RequestTimeout を付けて.cfmページをリクエストすると、そのcfmページのリクエストタイムアウト時間を変更することができました。
URL変数を追加するだけでタイムアウト時間を変更できるのは便利な機能でしたが、URL変数は簡単に値を書き換えたり削除することができます。ですので、わざとタイムアウトエラーを引き起こすことなども出来てしまいます。
そのような問題もあり、ColdFusion MX(6)から <cfsetting RequestTimeout="秒">が追加されました。タイムアウト時間を変更したい.cfmページがある場合は、そのページ内に<cfsetting>タグを追加してタイムアウト時間を設定します。<cfsetting>タグを書く必要はありますが、プログラムでタイムアウト時間を明示的に管理することができます。開発元からも、この方法によるタイムアウトが推奨され、URL.RequestTimeoutはColdFusion 8より非推奨の機能となり、ColdFusion 11で廃止となりました。

https://helpx.adobe.com/coldfusion/developing-applications/changes-in-coldfusion.html
(古いバージョン情報のため、英語ページのみ公開されています。Deprecatedに「For the <cfsetting> tag, URL.RequestTimeout attribute has been removed in ColdFusion 11」と書かれています

さて、スケジュールタスクの話に戻りますが、ColdFusion Administratorの「サーバーの設定 > スケジュールタスク」の登録画面には『タイムアウト(秒)』設定があります。この設定は、実行先のURLから入力した秒数までに応答が返って来ない場合はタスクをタイムアウトするものです。
それなのに『タイムアウト(秒)』に値を入力していると、そのタスクで呼び出すURLの末尾にRequestTimeoutパラメーターが暗黙的に付加されるという動作にもなっていました。それによって、タスクの実行が.cfmページだった場合、暗黙的にURL変数のRequestTimeoutが渡されることによって実行先.cfmページのタイムアウト時間の変更も行われる動作となっていました。
ですが、.cfmページ以外を指定したタスクにもURL変数のRequestTimeoutが追加(つもり実行先に何の意味も持たないパラメーターが勝手に付加)されたり、URL.RequestTimeoutによるタイムアウト時間の変更機能がColdFusion 11で廃止されたにも関わらず、ColdFusion 11のスケジュールタスクでは引き続きRequestTimeoutがURLに追加されたりするなど、不整合な状態がいくつも発生していました。

根本的な問題として、タスクで指定したURLにRequestTimeoutが勝手に付加されること自体、マニュアルに記載されていませんでした。さらに、ログを見ないとRequestTimeoutが暗黙的に付加されている事に気付かないような状態でした

タスクで指定したURLにRequestTimeoutが暗黙的に追加される動作は、ColdFusion 2016で不具合として登録され、ColdFusion2016のアップデータで、修正(URLにRequesttimeoutを暗黙的に付けなくする)が行われました。

https://tracker.adobe.com/#/view/CF-4198266

本来、スケジュールタスクで設定するタイムアウトは、実行先のURLから応答が返ってくるまでのタイムアウト時間だけであるべきでした。
ですので、ColdFusion 10までの暗黙的にURLにRequestTimeoutが付加されて呼び出し先の.cfmページのタイムアウト時間も変更されていた動作が、ColdFusion 11ではタイムアウト時間が変更されない動作に変わってしまったことなどに戸惑いを覚えるユーザーも居ました。

「タスクのURLにRequestTimeoutが暗黙的に追加され、呼び出し先の.cfmページのタイムアウト時間も変更される」という事自体がマニュアルに記載されていなかったので、「ColdFusion 11のタスクではそれは機能しなくなりました」という説明もされなかった事もユーザーが戸惑う原因になったと思います。

その状況を改善すべく、ColdFusion 2018では「<cfschedule>のrequestTimeOut属性」や、「スケジュールタスクの設定でタイムアウト設定」を廃止し、タイムアウトはColdFusion Administratorの『リクエストタイムアウト』時間に依存することになりました。
しかし、この変更は新たな問題を生み出しました。それは、スケジュールタスクのタイムアウト設定の本来の目的である「呼び出し先のページ処理が終わって応答が戻されるまで待っている」時間を変更できなくなったことです。これによって、以下のような問題が生じ、新たな不具合として登録されました。

https://tracker.adobe.com/#/view/CF-4206295
https://tracker.adobe.com/#/view/CF-4203044

  • 不具合の動作例
    1. ColdFusion Administratorの「サーバーの設定 > 設定」で『リクエストタイムアウト』を有効にして60秒を指定している
    2. そのサーバーで、処理の完了に100秒必要なtest.cfmページがあり、ページの先頭で<cfsetting RequestTimeout="120">を指定している
    3. タスクスケジューラーで、test.cfmを指定して実行すると、スケジュールタスクがエラーとなる
      • 指定先のtest.cfmでは<cfsetting>によってタイムアウト時間が120秒に延長されているため、ページの最後まで処理が行われますが、タスクスケジューラー自体は60秒を経過した時点で、タイムアウトエラーとなり終了します
  • これによって生じる問題
    • タスクスケジューラーの実行結果をファイルに出力している(パブリッシュ設定を有効にしてファイルに保存している)と、その結果がタスクの実行結果ではなく、Connection Timeout となる
    • scheduler.logにも、タスクがエラーとして、出力される[DefaultQuartzScheduler_Worker-1] - The request has exceeded the allowable time limit Tag: cfhttp
    • Enterprise版でタスクに対するイベントハンドラーを使用している場合、例外イベントが発生する

この問題を受け、ColdFusion 2021 Update 1とColdFusion 2018 Update 11ではスケジュールタスクのタイムアウト設定(呼び出し先のページ処理が終わって応答が戻されるまで待っている時間)が再び変更できるように修正されました。
ですので、(ColdFusion 2016アップデータの状態と同じく、タスクで指定したURLにRequesttimeoutが勝手に追加されることはありませんが)タスクで呼び出すURLの処理時間が長くかかることが予想される場合は、URLからの応答のタイムアウトの時間を再び変更することができるようになりました。

※補足ですが、ColdFusion 2021 のUpdate なしの状態でも、スケジュールタスクにはタイムアウト時間の設定項目が表示されます。ですが、そこに値を指定しても、値が保持されない不具合があります。この不具合は、Update 1で修正されました(→https://tracker.adobe.com/#/view/CF-4211053
 


記事公開日:2021年06月14日
最終更新日:2021年06月16日


x

Sample Modal Window

This is just a sample…

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent suscipit iaculis libero sed tristique. Quisque mollis dolor non tellus placerat vitae sodales lectus porta. Curabitur ut suscipit tellus. Maecenas rhoncus, ante vitae vehicula vestibulum, metus sapien dapibus tellus, et mattis dolor neque vitae nisl. Nullam eleifend ultrices ipsum eget pretium. Curabitur semper metus ut ante adipiscing nec volutpat sem rutrum. Nullam a nisi lacus, non interdum ante. Vivamus ante augue, commodo vel egestas sed, pharetra nec dui. Quisque sed tellus felis. Donec ipsum mauris, sagittis eu accumsan in, aliquam non ipsum.

Vestibulum tempor nunc nec felis scelerisque eget elementum erat dignissim. Ut vel ipsum mollis orci venenatis luctus. Aenean vehicula quam vel quam porttitor ac iaculis elit pulvinar. Proin consequat, ipsum eu venenatis semper, justo turpis posuere tortor, ac placerat metus nisl et lectus. Nulla cursus dui id nunc ullamcorper sed semper nisl lobortis. Aliquam erat volutpat. Phasellus arcu ante, imperdiet in ornare sed, laoreet eu massa.