大きなドキュメント コレクションを検索する関数を呼び出す Flex アプリケーションがあります。検索語によっては、ユーザーが flex からのリクエストを停止したい場合があります。
flex アプリケーションが要求を予期しないようにするだけでなく、CFC 要求も停止したいと考えています。これは可能ですか?これを行うための最良のアプローチは何ですか?
大きなドキュメント コレクションを検索する関数を呼び出す Flex アプリケーションがあります。検索語によっては、ユーザーが flex からのリクエストを停止したい場合があります。
flex アプリケーションが要求を予期しないようにするだけでなく、CFC 要求も停止したいと考えています。これは可能ですか?これを行うための最良のアプローチは何ですか?
ページ呼び出しを外部から停止する直接的な方法はないと思います。ドキュメントによると、スレッド自体とその親のみが特定のスレッドを中止できます。
ただし、共有スコープ内の特定のスレッドにフラグを設定することはできます。
バックグラウンド処理を開始するメソッドを呼び出すとします。一意のスレッド ID を生成し、呼び出し元に返します。スレッドは、(たとえば) アプリケーション スコープ内で、停止するように指示するフラグを探します。バックグラウンド プロセスの各サブステップでチェックします。フラグがスローされた時点で中断する可能性があります。
フラグをスローするには、サードパーティがスレッドの強制終了を開始できないようにするための十分なセキュリティと共に、中止するスレッドの名前を取る abort メソッドを追加します。
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>
ColdFusion 8 を使用している場合は、<cfthread>
タグを利用できます。独自のスレッドで検索プロセスを生成し、必要に応じてリモート呼び出しを使用して検索スレッドを終了できます。
<cfabort/>
または- のいずれかを使用してプログラムで要求を終了できます<cfsetting requesttimeout="0"/>
が、それは CF サーバー側のものであり、あなたが求めているものではないと思いますか?
リモートで終了する... まあ、FusionReactor がある場合は、Flex を使用してそれに接続し、リクエストを中断させることができるかもしれません。(もちろん、FusionReactor 内でリクエストを終了しようとすることはできますが、Flex が実際に FR にそれを停止するように依頼できるかどうかは不明です...それを行う方法があるかどうかは、FR メーリング リストで問い合わせる必要があります。)
おそらく代替の解決策は、複数のリクエストで機能するように検索を試行および構築することですが、それがどの程度実現可能かは、正確に何を検索しているかによって異なります。