【コラム】

Java API、使ってますか?

43 Early Draftで把握するEJB 3.1の新機能

43/60

JSR 318: Enterprise JavaBeans 3.1

Enterprise JavaBeans 3.1(EJB 3.1)は現在Java EE 5に採用されているEJB 3.0の後継バージョンであり、次期Java EEプラットフォームとなるJava EE 6をターゲットとして仕様の策定が進められている。JCPでは2月29日よりEary Draftが公開されており、3月30日にかけてレビューが行われている段階だ。

バージョン2.xから3.0にかけては大幅な仕様の変更が行われたEJBだが、3.1はマイナー・バージョンアップであり、Early Draftによれば主に次のような機能が追加される予定となっている。

  • ローカルビジネスインタフェースなしでSession Beanにアクセスする簡易ビューの提供
  • Singleton Session Beanの導入
  • Session Beanの非同期呼び出しをサポート
  • EJBタイマーの自動生成
  • カレンダーベースの式によるEJBタイマーの作成
  • 軽量化されたEJB仕様のサブセット (EJB 3.1 lite) を提供
  • EJBコンポーネントを、ejb-jarを用いずにWARファイルにパッケージング可能に

以下に、いくつかの新機能の概略を紹介する。

Session Beanへの簡易ビュー

従来ローカルクライアントからSession Beanにアクセスするには、個別に定義されたローカルビジネスインタフェースを介する必要があった。EJB 3.1ではこれを簡潔にし、ビジネスインタフェースなしでもSession Beanのpublicなメソッドにアクセスできる簡易ビューが提供される。

インタフェースを持たないビューはビジネスインタフェースと同様にJNDI経由でEJBコンテキストから取得できる。コンテキストは対象となるBeanの型を持ったビューへの参照を返すが、クライアントからアクセスできるのはあくまでもpublicなメソッドだけであり、その他のメソッドにアクセスしようとした場合にはjavax.ejb.EJBExceptionがスローされるとのこと。また、Session Beanのインスタンスを (コンテキストを介さないで) 直接生成することもできない。

Singleton Session Bean

EJB 3.1ではSingleton Session Beanがサポートされる。Singleton Session Beanは複数のクライアント間で単一のインスタンスが共有されるSession Beanで、@Singletonアノテーションを用いるか、デプロイメントデスクリプタによって定義する。

Singleton Session Beanのインタフェースを持たないビューに対する参照は、常に同じオブジェクト識別子を持つ。したがってequalsメソッドによる比較は常にtrueとなる。ただし、異なるビジネスインタフェースタイプへの参照どうしや、インタフェースタイプへの参照とインタフェースを持たないビューへの参照、異なるSession Beanへの参照どうしの比較はtrueにはならない。

Session Beanの非同期呼び出し

デフォルトでは、Session Beanの呼び出しはすべて同期呼び出しである。すなわち、処理を開始してから値を返すまでの間、単一のクライアントによってブロックされる。それに対して、EJB 3.1からは非同期呼び出しもサポートされることになった。非同期呼び出しが可能なメソッド (非同期メソッド) は()@Asynchronousアノテーションによって作成し、戻り値は必ずvoidまたはjava.util.concurrent.Future<V>のインスタンスとする (Vは実行結果の型)。

リスト1 非同期メソッドの定義例 (Early Draftより抜粋)

@Asynchronous
public Future performCalculation( ... ) {
       // ... 計算を実行
       Integer result = ...;
       return new AsyncResult(result);
}

クライアントがSession Beanに対して非同期呼び出しを行った場合、コンテナはクライアントにコントロールを渡し、独立したスレッドにおいて処理を実行する。処理が完了したらFuture<V>のインスタンスが返されるので、クライアントではここからgetメソッドによって実行結果を取得したり、cancelメソッドによって処理の取り消しを行ったりすることができる。

EJBタイマーサービスの拡張

EJBタイマーサービスを利用するには、Beanクラスにコールバックメソッドを実装し、javax.ejb.TimerServiceのcreateTimerメソッドを用いてjavax.ejb.Timerインスタンスを生成する。このときcreateTimerメソッドにはタイマーの持続時間やインターバルをlong値やjava.util.Dateオブジェクトとして指定するのが従来の方法だった。これに対してEJB 3.1ではカレンダーベースの式よって指定する方法が追加されている。

この式はjavax.ejb.ScheduleExpressionのインスタンスとしてリスト2のように生成する。この例では毎週日曜日の午前1時に実行されるタイマーになるとのこと。

リスト2 ScheduleExpressionによるタイマー生成の例 (Early Draftより抜粋)

ScheduleExpression schedule =
    new ScheduleExpression().dayOfWeek(“Sat”).hour(1);
Timer timer = timerService.createTimer(schedule, null);

また、EJB 3.1ではTimerServiceを利用せずに、コンテナによってタイマーを自動生成する方法が提供される。その場合、コールバックメソッドは@Scheduleアノテーションを用いて作成し、タイマーの持続時間はアノテーションのパラメータで指定する。たとえばリスト3のようにすると、毎月1日の午前1時に処理を実行するタイマーが生成されるという。

リスト3 タイマーを自動生成する例 (Early Draftより抜粋)

@Schedule(hour=”1”, dayOfMonth=”1”)
public void generateMonthlyAccountStatements() { ... }

EJB 3.1(lite)

EJB 3.1では、フルセットの実装とは別に軽量化されたサブセットを提供しようという案が持ち上がっている。これはJava EE 6で導入が検討されているプロファイル機能に関連したものとなる。Java EE 6ではプロファイル機能によって、部分的な実装のみを含む機能制限されたJava EEプラットフォームを提供できるようになる予定。その際、一般的でない機能を省いた軽量プロファイルの提供も検討されており、EJB 3.1(lite)はそれを念頭に置いた提案である。

具体的にどの機能をEJB 3.1 (lite)に含めるかなどは現在議論されている最中だが、たとえばEJB 2.1スタイルのSession Beanなどを省略し、EJB 3.xのアノテーションベースのスタイルのみを利用可能にする、などといったことが考えられる。

43/60

インデックス

連載目次
第60回 どうなる? 今後のJavaプラットフォーム(Java SE編)
第59回 どうなる? 今後のJavaプラットフォーム(Java EE編)
第58回 Java SE 7の要注目機能"クロージャ"はどうなるのか その6
第57回 Java SE 7の要注目機能"クロージャ"はどうなるのか その5
第56回 Java SE 7の要注目機能"クロージャ"はどうなるのか その4
第55回 Java SE 7の要注目機能"クロージャ"はどうなるのか その3
第54回 Java SE 7の要注目機能"クロージャ"はどうなるのか その2
第53回 Java SE 7の要注目機能"クロージャ"はどうなるのか
第52回 Early Draftが公開されたJSF 2.0
第51回 EJBから独立したJava Persistence 2.0
第50回 モバイルJavaの新しい潮流となるか - MSA 2.0のドラフト公開
第49回 やっぱり基本はServlet - Servlet 3.0のEarly Draftを読む
第48回 JOGLで3Dプログラミング その4
第47回 JOGLで3Dプログラミング その3
第46回 JOGLで3Dプログラミング その2
第45回 JOGLで3Dプログラミング
第44回 JARファイルを効率的にネットワーク転送するためのPack200形式
第43回 Early Draftで把握するEJB 3.1の新機能
第42回 次世代の携帯端末向けJava仕様"MIDP 3.0"はどうなるか その2
第41回 次世代の携帯端末向けJava仕様"MIDP 3.0"はどうなるか その1
第40回 リソースアダプタによる接続の仕組み
第39回 JCAを利用したシステム間接続
第38回 Java EEと外部システムの接続性を支えるJCAがバージョンアップ
第37回 Javaのモジュラリティ強化を担う"スーパーパッケージ"とは
第36回 JSR 308対応のコンパイラを試す
第35回 公開されたJSR 308のEarly Draftを検証する
第34回 スクリプト言語とJavaを結びつけるJSR 223
第33回 Java EE環境に統一されたコンポーネントモデルを提供するJSR 299 その2
第32回 Java EE環境に統一されたコンポーネントモデルを提供するJSR 299 その1
第31回 Javaの文法がそのまま使えるスクリプト言語"BeanShell"
第30回 Javaアプリケーションにオブジェクトのキャッシュ機構を提供するJCache API
第29回 Javaアプリケーションからのリソース管理を可能にするJSR 284
第28回 XMLデータソースへの問い合わせはJSR 225で
第27回 Portlet Specification 2.0をもっと手軽に利用する
第26回 次期Javaポートレット仕様となるJSR 286
第25回 JSFとポートレットをつなげるJSR 301
第24回 Webサービス向けのポートレット仕様「WSRP」
第23回 高い相互運用性を実現するポートレットAPI - JSR 168
第22回 Java EE環境でタスクのスケジューリングを可能にするJSR 236
第21回 Java EE環境でのスレッドプログラミングを可能にするJSR 237
第20回 音声認識/合成のためのAPI - Java Speech APIとJSR 113
第19回 JSR 291でJavaプラットフォームにダイナミックコンポーネントモデルを導入
第18回 JAX-RSで簡単RESTful - JSR 311
第17回 待望のServlet 3.0がJSRに登場 - JSR 315
第16回 アノテーションを使ってバグ退治 - JSR 305
第15回 アノテーションをさらに広い範囲で利用可能にするJSR 308
第14回 Webアプリケーション開発の要となるか - JSF 2.0がJSRに登場
第13回 Webサービス経由でのJMX Agentへの接続を可能にするJSR 262
第12回 Javaアプリケーションのモジュール化をサポートするJava Module System
第11回 "NIO.2"がやってきた - JSR 203: More New I/O APIs for the Java Platform
第10回 JSR 295: Beans Bindingの参照実装を試す
第9回 けっこう便利! 単位を扱うAPI -- JSR 275: Units Specification
第8回 アノテーションでバリデーション - JSR 303: Bean Validator
第7回 Swing開発の救世主となるか - Swing Application Framework
第6回 JavaBeansのプロパティを同期させるバインディングAPI
第5回 誰よりも早く"Java SE 7"を睨む
第4回 日時情報の取り扱いを改善する JSR 310: Date and Time API
第3回 古いAPIも進化している!? - JSR 919: JavaMail 1.4
第2回 JSR 1 リアルタイムJava仕様
第1回 JCPによって進められるJava関連技術の標準化

もっと見る

提供:マイナビ

会員登録はこちら

大学・大学院・短大・専門学生向けの就職情報サイト「マイナビ2010」「マイナビ2009」に今すぐ登録しよう!  大手企業からベンチャー企業までの約13,000社の企業情報を公開、エントリーが可能です。2010年卒予定の方は「マイナビ2010」に、2009年卒予定の方は「マイナビ2009」に登録してください。

毎日コミュニケーションズはプライバシーマークを取得しています。

関連キーワード


人気記事

一覧

イチオシ記事

新着記事