作業オブジェクトのコードをラップすることによって、その作業オブジェクトを並列に実行したり、異なる
J2EE コンテキストで実行したりすることができます。
始める前に
管理者は、管理コンソールを使用して、1 つ以上の作業マネージャーを
構成している必要があります。
このタスクについて
コードを並列に実行するには、作業オブジェクトのコードをラップします。
プロシージャー
- 作業オブジェクトを作成します。
作業オブジェクトは、com.ibm.websphere.asynchbeans.Work インターフェースをインプリメントします。
以下に例を示します。
class SampleWork implements Work
- このアプリケーション・コンポーネントが必要とする作業マネージャー数を判別します。
- java:comp ネーム・スペースで作業マネージャーのリソース参照 (論理名) を使用して、作業マネージャー (複数可) を検索します。
(リソース参照について詳しくは、
トピック参照を参照してください。)
InitialContext ic = new InitialContext();
WorkManager wm = (WorkManager)ic.lookup("java:comp/env/wm/myWorkManager");
作業マネージャーのリソース参照 (この場合は wm/myWorkManager) は、
アプリケーション・デプロイメント記述子でリソース参照として宣言する必要があります。
- パラメーターとして作業オブジェクトを使用し、WorkManager.startWork() メソッド
を呼び出す。 以下に例を示します。
Work w = new MyWork(...);
WorkItem wi = wm.startWork(w);
startWork() メソッドは、startTimeout パラメーターを取ることができます。 このパラメーターでは、Work オブジェクトの開始に対する厳しい時間制限が指定されます。 startWork()
メソッドは、作業項目オブジェクトを戻します。 このオブジェクトは、
コンポーネントと現在実行中の作業オブジェクトをリンクするハンドルです。
- [オプション] アプリケーション・コンポーネントが 1 つ以上の実行中作業オブジェクトが完了するまで待機する必要がある場合は、
WorkManager.join() メソッドを呼び出します。 以下に例を示します。
WorkItem wiA = wm.start(workA);
WorkItem wiB = wm.start(workB);
ArrayList l = new ArrayList();
l.add(wiA);
l.add(wiB);
if(wm.join(l, wm.JOIN_AND, 5000)) // block for up to 5 seconds
{
// both wiA and wiB finished
}
else
{
// timeout
// we can check wiA.getStatus or wiB.getStatus to see which, if any, finished.
}
このメソッドは、
コンポーネントが待機する作業項目の配列リスト、およびこのコンポーネントが 1 つの作業オブジェクトが完了するまで待機するのか、またはすべての作業オブジェクトが完了するまで待機するのかを示すフラグを受け取ります。タイムアウト値を指定することもできます。
- release() メソッドを使用して、作業単位の実行が停止するようシグナル通知します。
そうすると、作業単位は可能な限り早く実行を停止しようとします。
通常、このアクションは、次の例のようなスレッド・セーフ・アプローチを使用して、
フラグを切り替えることによって完了します。
public synchronized void release()
{
released = true;
}
Work.run() メソッドは、この変数を定期的に検査して、ループを終了するかどうかをチェックする必要があります。