作業マネージャーは、非同期 Bean を使用する J2EE アプリケーション用に作成されたスレッド・プールです。
作業マネージャーは、J2EE 1.4 アプリケーション用のプログラミング・モデルを提供します。 詳しくは、この文書のプログラミング・モデルのセクションを参照してください。
非同期 Bean を使用する Web や EJB コンポーネントを作成する場合、開発者は、作業マネージャーにアクセスする必要のある各コンポーネント内にリソース参照をインクルードする必要があります。 リソース参照について詳しくは、 文書参照を参照してください。コンポーネントは、データ・ソース、エンタープライズ Bean、または接続ファクトリーを検索する場合と同様、コンポーネント java:comp のネーム・スペース内にある論理名を使用して、 作業マネージャーをルックアップします。
デプロイヤーは、アプリケーションがデプロイされたときに、物理的な作業マネージャーを論理的な作業マネージャーにバインドします。
例えば、開発者が作業を銅レベル、銀レベル、および金レベルの間で区分するために 3 つのスレッド・プールを必要とする場合、開発者は、クライアント・アプリケーション・プロファイル内の属性に基づく論理プールを選択するためのコンポーネントを作成します。 デプロイヤーは、この 3 つのスレッド・プールの要求をマップする方法を柔軟に決定できます。 デプロイヤーは、小規模のマシン上で単一のスレッド・プールを使用することを決定する場合があります。 この場合、デプロイヤーは、3 つのリソース参照をすべて同じ作業マネージャー・インスタンス (つまり、同じ JNDI 名) にバインドします。 より大きなマシンを使用すると、3 つのスレッド・プールがサポートされる場合があります。この場合、デプロイヤーは、各リソース参照を別々の作業マネージャーにバインドします。 作業マネージャーは、同じサーバー上にインストールされた複数の J2EE アプリケーション間で共用できます。
アプリケーション開発者は、論理作業マネージャーを必要なだけ使用できます。 デプロイヤーは、アプリケーション内で定義された論理作業マネージャーに、物理作業マネージャーを 1 つマップするか、または複数マップするかを選択します。
複数の非同期有効範囲オブジェクトを共用する必要のある J2EE コンポーネントは、すべて同じ作業マネージャーを使用する必要があります。 これらの有効範囲オブジェクトは、単一の作業マネージャーと類縁性があります。非同期有効範囲を使用するアプリケーションで、有効範囲オブジェクトを使用しているすべてのコンポーネントが、同じ作業マネージャーを使用していることを確認する必要があります。
複数の作業マネージャーが定義されているときは、Java 仮想マシン (JVM) 内のアプリケーションが その作業マネージャーを検索する場合にのみ、基礎になるスレッド・プールが JVM に作成されます。 例えば、定義済みの 10 個のスレッド・プール (作業マネージャー) がある場合でも、アプリケーションがこれらのプールを検索しないかぎり、いずれも実際には作成されません。
注: 非同期 Bean は、リモート JVM に対する作業の実行依頼をサポートしません。
CommonJ 作業マネージャーは、作業マネージャーに類似しています。両者の違いは、CommonJ 作業マネージャーには、非同期 Bean 作業マネージャーのメソッドのサブセットが含まれていることです。CommonJ 作業マネージャーは J2EE 1.4 環境で動作しますが、 この仕様は J2EE 仕様には含まれていないので、このインターフェースは、 各 JNDI ネーミング・ルックアップの新規インスタンスを戻しません。
作業のリモート開始。リモートで実行される作業用の CommonJ 作業仕様のオプション・フィーチャーは、 サポートされていません。 作業単位が java.io.Serializable インターフェースをインプリメントする場合であっても、 その作業単位はリモートでは実行されません。
InitialContext ic = new InitialContext(); WorkManager wm = (WorkManager)ic.lookup("java:comp/env/wm/myWorkManager");
継承できるコンテキストは、 非同期 Bean を作成するアプリケーションが使用する作業マネージャーによって決まります。 管理者は、管理コンソールを使用して、作業マネージャーを使用可能にするサービスを選択し、作業マネージャーのスティッキー・コンテキスト・ポリシーを定義します。
CommonJ パッケージ | API | 非同期 Bean パッケージ | API |
作業マネージャー | 作業マネージャー | ||
非同期 Bean | Field - IMMEDIATE (long) | Field - IMMEDIATE (int) | |
Field - INDEFINITE | Field - INDEFINITE | ||
schedule(Work) throws WorkException, IllegalArgumentException | startWork(Work) throws WorkException, IllegalArgumentException | ||
schedule(Work, WorkListener) throws WorkException, IllegalArgumentException 注: 作業マネージャーの作業タイムアウト・プロパティーは、以前に startWork で timeout_ms として指定した値に構成してください。デフォルトのタイムアウト値は INDEFINITE です。
|
startWork(Work, timeout_ms, WorkListener) throws WorkException, IllegalArgumentException | ||
waitForAll(workItems, timeout_ms) | join(workItems, JOIN_AND, timeout_ms) | ||
waitForAny(workItems, timeout_ms) | join(workItems, JOIN_OR, timeout_ms) | ||
WorkItem | WorkItem | ||
getResult | getResult | ||
getStatus | getStatus | ||
WorkListener | WorkListener | ||
workAccepted(WorkEvent) | workAccepted(WorkEvent) | ||
workCompleted(WorkEvent) | workCompleted(WorkEvent) | ||
workRejected(WorkEvent) | workRejected(WorkEvent) | ||
workStarted(WorkEvent) | workStarted(WorkEvent) | ||
WorkEvent | WorkEvent | ||
Field - WORK_ACCEPTED | Field - WORK_ACCEPTED | ||
Field - WORK_COMPLETED | Field - WORK_COMPLETED | ||
Field - WORK_REJECTED | Field - WORK_REJECTED | ||
Field - WORK_STARTED | Field - WORK_STARTED | ||
getException | getException | ||
getType | getType | ||
getWorkItem().getResult() 注: この API は作業が完了してはじめて有効になります。
|
getWork | ||
Work | (extends Runnable) | Work | (Extends Runnable) |
isDaemon | * | ||
release | release | ||
RemoteWorkItem | このリリースには含まれていません。Extended Deployment または将来のリリースで配布される作業マネージャーを使用してください。 | 該当なし | |
TimerManager | AlarmManager | ||
resume | * | ||
schedule(Listener, Date) | create(Listener, context, time) ** パラメーターの変換が必要 | ||
schedule(Listener, Date, period) | |||
schedule(Listener, delay, period) | |||
scheduleAtFixedRate(Listener, Date, period) | |||
scheduleAtFixedRate(Listener, delay, period) | |||
stop | |||
suspend | |||
タイマー | Alarm | ||
cancel | cancel | ||
getPeriod | |||
getTimerListener | getAlarmListener | ||
scheduledExecutionTime | |||
TimerListener | AlarmListener | ||
timerExpired(timer) | fired(alarm) | ||
StopTimerListener | 該当なし | ||
timerStop(timer) | |||
CancelTimerListener | 該当なし | ||
timerCancel(timer) | |||
WorkException | (Extends Exception) | WorkException | (Extends WsException) |
WorkCompletedException | (Extends WorkException) | WorkCompletedException | (Extends WorkException) |
WorkRejectedException | (Extends WorkException) | WorkRejectedException | (Extends WorkException) |
非同期 Bean | CommonJ |
InitialContext ctx = new InitialContext(); com.ibm.websphere.asynchbeans.WorkManager wm = (com.ibm.websphere.asynchbeans.WorkManager) ctx.lookup(“java:comp/env/wm/MyWorkMgr”); |
InitialContext ctx = new InitialContext(); commonj.work.WorkManager wm = (commonj.work.WorkManager) ctx.lookup(“java:comp/env/wm/MyWorkMgr”); |
非同期 Bean | CommonJ |
public class MyWork implements com.ibm.websphere.asynchbeans.Work { public void release() { ...... } public void run() { System.out.println(“Running.....”); } |
public class MyWork implements commonj.work.Work{ public boolean isDaemon() { return false; } public void release () { ..... } public void run () { System.out.println(“Running.....”); } |
非同期 Bean | CommonJ |
MyWork work1 = new MyWork(new URI = “http://www.example./com/1”); MyWork work2 = new MyWork(new URI = “http://www.example./com/2”); WorkItem item1; WorkItem item2; Item1=wm.startWork(work1); Item2=wm.startWork(work2); // case 1: block until all items are done ArrayList col1 = new ArrayList(); Col1.add(item1); Col1.add(item2); wm.join(col1, WorkManager.JOIN_AND, (long)WorkManager.IMMEDIATE); // when the works are done System.out.println(“work1 data=”+work1.getData()); System.out.println(“work2 data=”+work2.getData()); // case 2: wait for any of the items to complete. Boolean ret = wm.join(col1, WorkManager.JOIN_OR, 1000); |
MyWork work1 = new MyWork(new URI = “http://www.example./com/1”); MyWork work2 = new MyWork(new URI = “http://www.example./com/2”); WorkItem item1; WorkItem item2; Item1=wm.schedule(work1 ); Item2=wm.schedule(work2); // case 1: block until all items are done Collection col1 = new ArrayList(); col1.add(item1); col1.add(item2); wm.waitForAll(col1, WorkManager.IMMEDIATE); // when the works are done System.out.println(“work1 data=”+work1.getData()); System.out.println(“work2 data=”+work2.getData()); // case 2: wait for any of the items to complete. Collection finished = wm.waitForAny(col1, 1000); // check the workItems status if (finished != null) { Iterator I = finished.iterator(); if (i.hasNext()) { WorkItem wi = (WorkItem) i.next(); if (wi.equals(item1)) { System.out.println(“work1 = “+ work1.getData()); } else if (wi.equals(item2)) { System.out.println(“work1 = “+ work1.getData()); } } } |
非同期 Bean | CommonJ |
InitialContext ctx = new InitialContext(); com.ibm.websphere.asynchbeans.WorkManager wm = (com.ibm.websphere.asynchbeans.WorkManager) ctx.lookup(“java:comp/env/wm/MyWorkMgr”); AsynchScope ascope; Try { Ascope = wm.createAsynchScope(“ABScope”); } Catch (DuplicateKeyException ex) { Ascope = wm.findAsynchScope(“ABScope”); ex.printStackTrace(); } // get an AlarmManager AlarmManager aMgr= ascope.getAlarmManager(); |
InitialContext ctx = new InitialContext(); Commonj.timers.TimerManager tm = (commonj.timers.TimerManager) ctx.lookup(“java:comp/env/tm/MyTimerManager”); |
非同期 Bean | CommonJ |
// create alarm ABAlarmListener listener = new ABAlarmListener(); Alarm am = aMgr.create(listener, “SomeContext”, 1000*60); |
// create Timer TimerListener listener = new StockQuoteTimerListener(“qqq”, “johndoe@example.com”); Timer timer = tm.schedule(listener, 1000*60); // Fixed-delay: schedule timer to expire in // 60 seconds from now and repeat every // hour thereafter. Timer timer = tm.schedule(listener, 1000*60, 1000*30); // Fixed-rate: schedule timer to expire in // 60 seconds from now and repeat every // hour thereafter Timer timer = tm.scheduleAtFixedRate(listener, 1000*60, 1000*30); |