| JBoss EJB 3.0と拡張機能
メッセージ駆動型POJO
はじめに
| メッセージ駆動型Beanは非常に強力で柔軟ですが、メッセージ型の遠隔手続き呼び出し（RPC）アプリケーションでは柔軟すぎてしまう場合も多いでしょう。クライアントとBeanとの間で、使用するメッセージキューと正確なメッセージ交換形式を事前に取り決めておく必要があります。単にメッセージチャネルを利用して信頼性の高い非同期RPCを行いたいだけの開発者にとっては、これは少し面倒なことです。また、クライアントとメッセージの終端との間の相性はコンパイル時には検査されないため、実行時エラーの原因となる可能性があります。さらに、EJB 3.0のメッセージ駆動型Beanは`MessageListener`インタフェースを実装しなければならない「コンポーネント」のままです。つまり、POJOではないのです。 JBoss EJB 3.0アプリケーションサーバでは、メッセージ駆動型のRPCを実装するための、より簡単な方法を提供しています。メッセージの終端としてPOJOを使用できます（メッセージ駆動型POJO）。RPCの呼び出し側は自動生成されたPOJOのスタブを取得し、POJOメソッドに対して通常通りの呼び出しを行います。JBossのメッセージ駆動型POJOはEJB 3.0のセッションBeanとほとんど同じように動作します。違いは、すべての呼び出しがメッセージキューを経由することです。このトレイルでは、JBossのメッセージ駆動型POJOの使い方について議論します。
サンプルアプリケーション
| このトレイルのサンプルアプリケーションでは、JSPページ`calculator.jsp`がメッセージキューを通して、メッセージ駆動型POJOの計算メソッドを非同期に呼び出します。メッセージ駆動型POJOは計算を終えると、結果をシステムのキャッシュマネージャに保存します。`check.jsp`ページがキャッシュ内の結果をチェックし、結果を取得できたら表示します。メッセージ駆動型Beanのトレイルで用いたサンプルアプリケーションと同じような動きをします。
POJOビジネスインタフェース
| メッセージ駆動型POJOを定義するには、まずビジネスインタフェースを定義します。ビジネスインタフェースには`@Producer`アノテーションを指定します。このインタフェースで定義するメソッドは結果を返せないことに注意してください。メッセージ駆動型POJOに対するメソッド呼び出しは非同期に行われ、呼び出し側は結果を待ちません。
    @Producer
    public interface Calculator {

      public void doCalculation (long sent, int start, int end,
                                 double growthrate,
                                 double saving);
    }
メッセージ駆動型POJOの実装
| メッセージ駆動型POJOの実装には`@Consumer`アノテーションを使用します。アノテーションの属性にメッセージキューのプロパティを指定できます。ここでも同様に、メッセージキューが未定義の場合はJBossがサーバ起動時に作成します。
    @Consumer(activationConfig =
    {
      @ActivationConfigProperty(propertyName="destinationType",
        propertyValue="javax.jms.Queue"),
      @ActivationConfigProperty(propertyName="destination",
        propertyValue="queue/mdpojo")
    })
    public class CalculatorBean implements Calculator {

      public void doCalculation (long sent, int start, int end,
                                 double growthrate, double saving) {

        double result = calculate (start, end, growthrate, saving);

        // Save in the system's results cache
        RecordManager.addRecord (new Timestamp(sent), result);
      }

      private double calculate (int start, int end,
                                double growthrate, double saving) {
        // ... ...
      }

    }
クライアント
| クライアント側でメッセージ駆動型POJOを使用するには、JNDIを使って`@Producer`インタフェースのスタブオブジェクトをルックアップします。自動生成されるスタブオブジェクトは、`@Producer`インタフェースの実装だけではなく、`ProducerObject`というコンポーネントインタフェースも実装しています。`ProducerObject.getProducerManager()`メソッドを使って`ProducerManager`オブジェクトを取得し、このオブジェクトを使ってJMSコネクションを作成します。JMSコネクションが確立されると、`@Producer`スタブオブジェクトのどのメソッドも呼べるようになり、事前に定義したメッセージキューを通してメソッドが呼ばれます。次に示すコードの抜粋は、メッセージ駆動型POJOのクライアントです。
    InitialContext ctx = new InitialContext();
    Calculator cal = (Calculator) ctx.lookup(
                    Calculator.class.getName());
    ProducerObject po = (ProducerObject) cal;
    ProducerManager manager = po.getProducerManager();

    manager.connect(); // internally create a JMS connection
    try {
      result = nf.format(cal.calculate(start, end, growthrate, saving));
    } finally {
      manager.close(); // clean up the JMS connection
    }
ソースコード参照
| メッセージ駆動型POJO Calculator.java: メッセージ駆動型POJOのビジネスインタフェース MdpojoCalculatorBean.java: メッセージ駆動型POJOの実装 クライアント calculator.jsp: クライアントユーザインタフェースのJSPページ
まとめ
| このトレイルでは、JBossアプリケーションサーバのメッセージ駆動型POJOについて学びました。次のトレイルでは、EJB 3.0アプリケーション内でのサービスオブジェクトの効果的な取得方法と使用方法について学びます。