エンタープライズJavaの開発者ならJBossのGavin King氏をご存知だろう。Hibernateの生みの親で、JBossのHibernate獲得にあわせて現在はJBossに在籍している。

同氏はここ1年ほど、EJB 3.0とJSFを結びつけるフレームワークとしてJBoss Seamを開発し、BorlandとGoogle、Oracle、Sun Microsystemsの4社とともにJSRとして標準化を進めている

同氏はこの経験からJava EE 6に対してもいくつかの提案を行っている。そのひとつがEJBの拡張だ。この提案は間もなくJSRとして提案される見込みだが、既に同氏はブログに提案内容と提案に至った理由を投稿している。ここではそのなかから興味深いものを紹介したい。

EJB Session Beansの並行アクセスサポート

最初に挙げられているのが複数のクライアントからの並行アクセスをサポートしたEJB Session Beans。Singletonで複数スレッドにわたる設定を共有する場合などに有用だとされている。

同氏はデフォルト動作としてのサポートなし、Beanの管理によるサポート、コンテナの管理によるサポートと3パターンを提案している。

パターンの指定はアノテーションにより、次の例が挙げられている。

@Stateful
   @ConcurrencyManagement(CONTAINER)
   public class Counter {
      private int count;
      public void inc() { count== ; }
      @ReadOnly public int value() { return count; }
   }

軽量な非同期サポート

現在のEJBでは非同期アクセスをする際に、JMSとTimerを使う方法が用意されている。JMSは高いサービス品質を実現できる一方で、多くの場合に要求に対してオーバースペック、「やりすぎ」になってしまう。King氏はこれをふまえ、Timerの拡張を提案している。

メタ・アノテーション

King氏の最大の希望という提案が「メタ・アノテーション」。EJBのBeanに対してつけるアノテーションには一定のパターンがある。端的にいえば複数のアノテーションをひとつのアノテーションにまとめようということだ。

例えばJBoss Seamにおいてのパターンとして同氏が挙げているのは次のようなもの。

@Stateful
@TransactionAttribute(MANDATORY)
@Scope(CONVERSATION)
@RolesAllowed(USER)
@ConcurrencyManagement(CONTAINER)
@Name("createOrder")
public class CreateOrderBean implements CreateOrder { .... }

ここで、まず次のようなアノテーションを定義する。

@Stateful
@TransactionAttribute(MANDATORY)
@Scope(CONVERSATION)
@RolesAllowed(USER)
@ConcurrencyManagement(CONTAINER)
public @interface AjaxConversation { .... }

こうしたうえで、

@AjaxConversation
@Name("createOrder")
public class CreateOrderBean implements CreateOrder { .... }

とすることで、最初のリストと同じ意味を持たせようというもの。JBoss Seamのようにアノテーションを多用するフレームワークで有用だろう。

同氏は、このほかにもJMS/JavaMail送信の単純化、ステートフルなWeb Serviceエンドポイントのサポートなども挙げている。