Skip to main content

作業キューのデタッチとアタッチ

通常は、作業キュー・マネージャを使用している場合、ワーカ・ジョブのセットを初期化して作業項目をキューイングしたら、ワーカ・ジョブが作業項目を完了するまで待機します。しかし、ワーカ・ジョブが作業項目を完了するのに予想より長くかかっていたり、単一のプロセスを待機専用にできないといった状況が発生する場合があります。そのため、作業キュー・マネージャでは、プロセスから作業キューをデタッチし、その後作業キューを同じプロセスまたは異なるプロセスにアタッチすることが可能です。

例えば、queue が、ユーザが初期化した作業キューを参照しているとします。さらに、作業項目をいくつか作業キューに追加したと想定します。Wait() または WaitForComplete() を呼び出して処理中の作業のステータスを判別する前に、以下のメソッドを使用できます。

作業キューのデタッチ

method Detach(ByRef token As %String, timeout As %Integer=86400) as Status

作業キューを初期化したときに作成したオブジェクト参照から作業キュー・オブジェクトをデタッチします。Detach() メソッドは、進行中の作業を続行できるようにし、作業キューの現在の状態を保持します。

token 引数はセキュア・トークンを表します。セキュア・トークンを使用して、後で作業キューを別のプロセスにアタッチできます。timeout 引数はオプションです。デタッチされた作業キュー・オブジェクトをシステムが保持する時間 (秒単位) を指定します。タイムアウト時間が経過すると、作業キューに関連付けられたワーカ・ジョブと情報は削除されます。timeout の既定値は 1 日です。

Detach() メソッドを呼び出した後は、デタッチされたオブジェクト参照に対するほとんどの呼び出しはエラーを返します。ただし、NumActiveWorkers() メソッドおよび NumWorkers() メソッドは -1 を返します。

作業キューのアタッチ

method Attach(token, ByRef sc As %Status) as WorkMgr

新しいオブジェクト参照を、以前にデタッチした作業キュー・オブジェクトにアタッチします (その作業キュー・オブジェクトがまだメモリ内にある場合)。Attach() メソッドは、作業キューに関連付けられた作業キュー・マネージャの新しいインスタンスを返します。その後、作業キュー上でメソッドを呼び出せます。例えば、timeout の値を 0 に設定して Wait() メソッドを呼び出して、キューがデタッチされる前に作業項目を完了したかどうかを判別できます。

token 引数は、以前に作業キュー上で呼び出した Detach() メソッドによって返されるセキュア・トークンを表します。

例えば、以下のように作業キューをデタッチしてから、再度アタッチできます。

Set sc=queue.Detach(.token,60)
If $$$ISERR(sc) {
       Return sc
    }
Set queue=$system.WorkMgr.Attach(token,.sc)
If $$$ISERR(sc) {
       Return sc
    }

FeedbackOpens in a new tab