コールバックの使用
コールバックとは、作業キュー・マネージャが作業項目の完了後に実行する必要があるコードです。以下の 2 つの理由で、コールバックを使用できます。
-
作業項目の完了に依存する作業を実行する
-
作業項目を非同期に完了することを選択している場合に、キューイングされた作業がすべて完了したことを通知する
作業項目に対するコールバックの組み込み
コールバックを追加するには、作業項目を作業キューに追加する際に、Queue() メソッドの代わりに QueueCallback() メソッドを呼び出します。
method QueueCallback(work As %String, callback As %String, args... As %String) as %Status
work メソッドと args メソッドは、Queue() メソッドのものと同じです。ただし、以下の構文を使用して、実行するコールバック・コードを callback 引数で指定します。
-
クラス・メソッドの場合は ##class(Classname).ClassMethod
-
サブルーチンの場合は $$entry^rtn
クラス・メソッドまたはサブルーチンは、メインの作業項目と同じ引数を同じ順序で受け付ける必要があります。マスタ・プロセスは、メインの作業項目とコールバック・コードに同じ引数を渡します。
コールバック・コードでは、以下のパブリック変数にアクセスできます。
-
%status。作業単位によって返される %StatusOpens in a new tab 値を格納します。
-
%workqueue。作業キュー・インスタンスの OREF です。
これらのパブリック変数はコールバック内では利用できますが、作業項目内では利用できません。
コールバックを使用した完了の判断
WaitForComplete() メソッドを使用して、作業キュー内のキューイングされた作業がすべて完了するまで待ってからマスタ・プロセスに戻るのではなく、以下のように、作業キュー・マネージャをポーリングして完了を判断することができます。
-
Queue() メソッドの代わりに QueueCallback() メソッドを使用して、前のセクションで説明されているように、作業項目を作業キューに追加します。
-
すべての作業項目の作業が完了したら、コールバック・コードでパブリック変数 %exit を 1 に設定します。
-
WaitForComplete() メソッドの代わりに Wait() メソッドを使用します。
method Wait(qspec As %String, byRef AtEnd As %Boolean) as %Status
Wait() メソッドは、終了して呼び出し元に戻るためにコールバックからのシグナルを待機します。具体的には、コールバック・コードでパブリック変数 %exit を 1 に設定するまで待機します。Wait() は参照によって AtEnd を返します。AtEnd が 1 の場合、作業はすべて完了しています。または、AtEnd が 0 の場合、1 つ以上の作業項目が完了していません。