Singleton Session Beans の並行処理
javax.ejb.ConcurrencyManagementType.CONTAINER あるいは javax.ejb.ConcurrencyManagementType.BEAN を使用すればいいようだ。
@ConcurrencyManagement(CONTAINER)
@Singleton
public class ExampleSingletonBean {
private String state;
@Lock(READ)
public String getState() {
return state;
}
@Lock(WRITE)
public void setState(String newState) {
state = newState;
}
}
@ConcurrencyManagement(CONTAINER) アノテーションによってコンテナによって並行処理を管理する。
ちなみにデフォルトで @ConcurrencyManagement(CONTAINER) が設定されるようなのです。
これを利用することによって、@Lock(READ) と @Lock(WRITE) アノテーションによって排他制御を可能とする。
タイムアウトの設定方法
@AccessTimeout アノテーションによって可能となります。
下記コードでは Singleton Session Bean のデフォルトタイムアウトの設定時間は 120000 ミリ秒となってます。
doTediousOperation メソッドのタイムアウト設定時間は Singleton Session Bean のデフォルトタイムアウト時間より優先され 360000 ミリ秒となります。
@Singleton
@AccessTimeout(value=120000)
public class StatusSingletonBean {
private String status;
@Lock(WRITE)
public void setStatus(String new Status) {
status = newStatus;
}
@Lock(WRITE)
@AccessTimeout(value=360000)
public void doTediousOperation() {
...
}
}
ちなみに TimeUnit.SECONDS 定数を使えばこのように解りやすくなります。
@Singleton
@AccessTimeout(value=60, timeUnit=SECONDS)
public class StatusSingletonBean { ... }
@ConcurrencyManagement(BEAN) による並行処理は全てのビジネスメソッド及びタイムアウトメソッドの並行処理を可能とします。
ただし、それらは開発者によりすべてのクライアントへの同期化を保証する責任があります。
Java の並行処理技術を駆使して高レベルなプログラミング技術が必要とされるようです。
@ConcurrencyManagement(BEAN)
@Singleton
public class AnotherSingletonBean { ... }
Java EE 6 Tutorial の Singleton Session Bean の並行処理をざっと目を通してる最中ですがなかなか凝ってますね。
最後にこの内容は英語が駄目な素人が勝手に解釈したメモ書き程度のものですから詳しく知りたい方は本家のチュートリアルをご参照くださいませ。
Hatena タグ: Java EE
Tags: Java EE