ColdFusionリクエストを停止することはできますか?
-
03-07-2019 - |
質問
大規模なドキュメントコレクションを検索する関数を呼び出すFlexアプリケーションがあります。検索語に応じて、ユーザーはflexからのリクエストを停止したい場合があります。
I <!>#8217; dは、flexアプリケーションがリクエストを予期するのを停止するだけでなく、CFCリクエストも停止するようにします。これは可能ですか?これを行うための最善のアプローチは何ですか!
解決
Ben Doomの答えに追加するために、これを実現する方法のコード例をいくつか示します。以下のコードを整理して呼び出すコードには、複数のアプローチと名前の付け方がありますが、うまくいけば便利です。
リクエストの開始中のある時点で、プロセスに関する情報を共有スコープに保存し、クライアントにIDを返します。以下は、ページまたはリモートリクエストで使用できる関数の例です。
<cffunction name="createProcess" output="false">
<cfset var id = createUUID()>
<cfset application.processInfo[id] = {
progress = 0,
kill = false
}>
<cfreturn id />
</cffunction>
クライアントは、サーバーをポーリングして進行状況を確認したり、プロセスを強制終了するリクエストを送信したりできます
<cffunction name="getProcessProgress" output="false">
<cfargument name="processID" required="true">
<cfreturn application.processInfo[arguments.processID].progress />
</cffunction>
<cffunction name="killProcess" output="false">
<cfargument name="processID" required="true">
<cfset application.processInfo[arguments.processID].kill = true />
</cffunction>
問題の実際のサーバー側プロセスは、たとえばループ中に関数をヒットして、処理を中止し、必要に応じて作業をクリーンアップする必要があるかどうかを確認できます。
<cffunction name="shouldKillProcess" output="false">
<cfargument name="processID" required="true">
<cfreturn application.processInfo[arguments.processID].kill />
</cffunction>
他のヒント
外部からページ呼び出しを停止する直接の方法はないと思います。ドキュメントによると、スレッド自体とその親のみが特定のスレッドを中止できます。
ただし、共有スコープ内の特定のスレッドにフラグを設定できます。
バックグラウンド処理を開始するメソッドを呼び出すとしましょう。一意のスレッドIDを生成し、呼び出し元に返します。スレッドは、(たとえば)停止するように指示するアプリケーションスコープでフラグを探します。バックグラウンドプロセスの各サブステップでチェックします。フラグがスローされた時点で中断する可能性があります。
フラグをスローするには、中止するスレッドの名前を取得するabortメソッドを追加します。サードパーティがスレッドを強制終了しないようにするための十分なセキュリティがあります。
ColdFusion 8を使用している場合は、<cfthread>
タグを使用できます。検索プロセスを独自のスレッドで生成し、必要に応じてリモート呼び出しを使用して検索スレッドを終了できます。
- Livedocページ cfthread
- ColdFusionでのスレッドの使用
プログラムで<cfabort/>
または<cfsetting requesttimeout="0"/>
のいずれかでリクエストを終了できますが、それはCFサーバー側の問題です。あなたが求めているのはそれだとは思いませんか?
リモートで終了する...まあ、FusionReactorをお持ちの場合は、Flexを使用して連絡を取り、リクエストを中断することができます 。 (FusionReactor内でリクエストを確実に終了させることはできますが、Flexが実際にFRに停止を要求できるかどうかにかかわらず、それを行う方法がある場合はFRメーリングリストでそれを要求する必要があります。)
おそらく別の解決策は、複数のリクエストで機能するように検索を試行して設計することですが、それがどの程度実現可能かは、検索する内容によって異なります。