WebSphere Application Server for i5/OS, Version 6.1   
             オペレーティング・システム: i5/OS

             目次と検索結果のパーソナライズ化

JMS を使用する J2EE アプリケーションの開発

このタスクを使用して、非同期メッセージングに JMS API を直接使用する J2EE アプリケーションを開発します。

このタスクについて

このトピックでは、JMS API を非同期メッセージングに直接使用するための J2EE アプリケーション (サーブレットまたは Enterprise Bean) の開発に必要なステップについて概説しています。

このトピックは、JMS 関連の考慮事項についてのみ解説します。 一般的な J2EE アプリケーション・プログラミングについては、既に精通しているものと見なし、 ここでは説明しません。これらのステップに関する詳細や、 JMS を使用する J2EE アプリケーションの開発例については、 「Java Message Service Documentation」を参照してください。

J2EE アプリケーションが使用する JMS リソースの詳細は、 WebSphere Application Server に定義され、 WebSphere 管理サポートによって JNDI ネーム・スペースにバインドされます。

JMS を使用するために、J2EE アプリケーションのすべてのメソッドは以下の一般的なステップを実行します。

プロシージャー

  1. JMS パッケージをインポートします。 JMS を使用する J2EE アプリケーションは、JMS への複数のインポート・ステートメントで開始します。 このインポート・ステートメントには、少なくとも以下の内容が含まれます。
    import javax.jms.*;       //JMS interfaces
    import javax.naming.*;    //Used for JNDI lookup of administered objects
  2. 初期コンテキストを取得します。
       try {
            ctx = new InitialContext(env);
    ...
  3. JNDI ネーム・スペースから管理オブジェクトを検索します。 InitialContext.lookup() メソッドを使用して管理対象オブジェクト (JMS 接続ファクトリーおよび JMS 宛先) を検索します。キューからメッセージを受信する例を以下に示します。
           qcf = (QueueConnectionFactory)ctx.lookup( qcfName );
    ...
           inQueue = (Queue)ctx.lookup( qnameIn );
    ...
    
    JNDI ルックアップにより、 管理上定義された JMS 宛先オブジェクトを取得する代替方法として 、Session.createQueue(String) メソッド または Session.createTopic(String) メソッドを使用する方法がありますが 、この場合は管理が難しくなります。以下に例を示します。
    Queue q = mySession.createQueue("Q1");
    既存の宛先 Q1 を参 照するために使用できる JMS キュー・インスタンスを作成します。

    最も単純な形式では、これらの create メソッドへのパラメーターは既存の宛先の名前です。 より複雑な状況の場合、アプリケーションは URI ベースの形式を使用します。 この形式により、任意の数の名前値ペアが、 JMS 宛先オブジェクトのさまざまなプロパティーを設定するために提供されます。

  4. メッセージング・サービス・プロバイダーへの接続を作成します。 この接続により、基礎となるトランスポートへのアクセスが提供され、セッションの作成に使用されます。 ファクトリー・オブジェクトの createQueueConnection() メソッドを使用して、接続を作成します。
           connection = qcf.createQueueConnection();
    
    JMS 仕様では、接続が停止状態で作成されなければならないことが定義されています。 この接続に関連付けられた MessageConsumers は、接続が開始されるまでメッセージを受信することはできません。 接続を開始するには、以下のコマンドを発行します。
           connection.start();
  5. メッセージを送受信するためのセッションを作成します。 このセッションは、メッセージを作成および利用するためのコンテキストを提供します。 MessageProducers および MessageConsumers の作成に使用するメソッドも含まれます。 createQueueSession メソッドは、この接続でセッションを取得するために使用します。 このメソッドは、次の 2 つのパラメーターを取ります。
    • セッションが処理されるかどうかを決定するブール値。
    • 応答モードを決定するパラメーター。
           boolean transacted = false;
           session = connection.createQueueSession( transacted,
                                                   Session.AUTO_ACKNOWLEDGE);
    

    この例では、セッションは処理されず、受信メッセージを自動的に確認するはずです。 これらの設定では、メッセージは、システム・エラーの後か、またはアプリケーションが予期せずに終了された場合にのみバックアウトされます。

    EJB 仕様で定義されているように、 これらのフラグには以下の点が当てはまります。
    • createQueueSession で渡されるトランザクション処理済みフラグは、 グローバル・トランザクション内では無視され、 すべての作業がトランザクションの一環として実行されます。 トランザクション外ではトランザクション処理済みフラグが使用されます。 フラグが true に設定されている場合、 アプリケーションは session.commit() および session.rollback() を使用して、 作業の完了を制御する必要があります。 EJB2.0 モジュールでは、 トランザクション処理済みフラグが true に設定されて、XA トランザクション外にある場合、 セッションは WebSphere ローカル・トランザクションに関与しており、 メソッドの未解決のアクション属性は、アプリケーションによってコミットまたはロールバックされない場合に JMS 作業に適用されます。
    • クライアントは、Message.acknowledge() を使用してメッセージを確認することはできません。CLIENT_ACKNOWLEDGE の値が createxxxSession 呼び出しに渡されると、 メッセージは、アプリケーション・サーバーによって自動確認され、Message.acknowledge() は使用されません。
  6. メッセージを送信します。
    1. メッセージを作成する MessageProducer を作成します。 Point-to-Point メッセージングの場合、MessageProducer は、出力キュー・オブジェクト (以前に検索されたもの) をセッションの createSender メソッドに渡すことによって作成された QueueSender です。 QueueSender は、通常、特定のキューを対象に作成されます。 そのため、この送信側を使用して送信されたすべてのメッセージは同じ宛先に送信されます。
             QueueSender queueSender = session.createSender(inQueue);
      
    2. メッセージを作成します。 セッションを使用して、空のメッセージを作成し、渡されたデータを追加します。

      JMS は、いくつかのメッセージ・タイプを提供します。各メッセージ・タイプが、その内容の知識の一部を具体化します。 ベンダー固有のクラス名でメッセージ・タイプを参照しないようにするために、 メッセージ作成のセッション・オブジェクトにメソッドが提供されます。

      この例では、テキスト・メッセージが outString プロパティーから作成されます。
             TextMessage outMessage = session.createTextMessage(outString);
      
    3. メッセージを送信します。
      メッセージを送信するため、QueueSender の送信メソッドにメッセージが渡されます。
             queueSender.send(outMessage);
      
  7. 応答を受信します。
    1. 何らかの応答を伴って送信されたメッセージをリンクする相関 ID を作成します。 この例では、クライアントは、JMSCorrelationID にプロバイダー固有のメッセージ ID を使用して、 送信済みのメッセージに関連する応答メッセージを受信します。
             messageID = outMessage.getJMSMessageID();
      メッセージ・セレクターでこの相関 ID を使用して、 この ID を持つメッセージのみを選択します。
             String selector = "JMSCorrelationID = '"+messageID+"'";
    2. メッセージを受信する MessageReceiver を作成します。 Point-to-Point の場合、MessageReceiver は、入力キュー・オブジェクト (以前に検索されたもの) およびメッセージ・セレクターを、セッションの createReceiver に渡すことによって作成された QueueReceiver です。
             QueueReceiver queueReceiver = session.createReceiver(outQueue, selector);
      
    3. 応答メッセージを検索します。 応答メッセージを検索するには、受信メソッドで QueueReceiver を使用します。
             Message inMessage = queueReceiver.receive(2000);

      受信呼び出しのパラメーターは、ミリ秒単位のタイムアウトです。 このパラメーターは、即時に使用可能なメッセージがない場合の、メソッドの待ち時間を定義します。 このパラメーターを省略すると、この呼び出しは無期限にブロックします。 遅延を避けるには、receiveNoWait() メソッドを使用します。 この例では、受信呼び出しは、メッセージの到着時か、2000 ミリ秒後 (いずれか早い方) に戻ります。

    4. 受信したメッセージに基づいた処理をします。 受信したメッセージは、クライアントのビジネス・ロジックの必要に応じて処理できます。 一般的な JMS アクションの中には、メッセージが正しいタイプであるかどうかを検査し、 そのメッセージの内容を抽出するものがあります。 メッセージの本文から内容を抽出するには、 一般的な Message クラス (宣言済みの受信メソッドの戻りの型) から、 TextMessage などの、より特化されたサブクラスへキャストする必要があります。 キャストする前に必ずメッセージ・クラスをテストすることをお勧めします。 そうすることで、予期しないエラーを慌てずに処理することができます。

      この例では、オペレーターのインスタンスは、 受信したメッセージが TextMessage タイプであるかどうかを検査するために使用されます。 検査の後で、メッセージの内容は、TextMessage サブクラスへキャストすることによって抽出されます。

             if ( inMessage instanceof TextMessage )
      
      ...
                 String replyString = ((TextMessage) inMessage).getText();
      
  8. 終了します。 アプリケーションが、セッション・レベル、またはそれ以下のレベルで、 多くの短命の JMS オブジェクトを作成する必要がある場合は、使用しているすべての JMS リソースを閉じることが重要です。 これは、リソースが必要なくなった時点で、さまざまなクラスの close() メソッド (QueueConnection、QueueSession、QueueSender、および QueueReceiver) を呼び出すことで行います。
           queueReceiver.close();
    ...
           queueSender.close();
    ...
           session.close();
           session = null;
    ...
           connection.close();
           connection = null;
    
  9. メッセージをパブリッシュおよびサブスクライブします。 Point-to-Point メッセージングではなく JMS Publish/Subscribe サポートを使用する場合、 セッションや接続の作成など、一般的なアクションは同じです。 例外は、以下のメッセージのパブリッシュ例に示すように、 キュー・リソースの代わりにトピック・リソースが使用されている (QueueSender の代わりに TopicPublisher が使用されるなど) ことです。
    // Creating a TopicPublisher
           TopicPublisher pub = session.createPublisher(topic);
    ...
           pub.publish(outMessage);
    ...
           // Closing TopicPublisher
           pub.close();
    
  10. エラーを処理します。 すべての JMS ランタイム・エラーは、例外によって報告されます。 JMS 内のメソッドの大部分は、JMSExceptions をスローしてエラーを示します。 これらの例外をキャッチして適切な出力に表示するプログラミングを組むことをお勧めします。

    一般的な Java 例外とは異なり、JMSException には別の例外を組み込むことができます。 JMSException のインプリメンテーションは、 組み込みの例外をこの toString() メソッドの出力に含みません。 したがって、下記の例に示すように、組み込みの例外を明示的に検査し、出力する必要があります。

        catch (JMSException je)
        {
           System.out.println("JMS failed with "+je);
           Exception le = je.getLinkedException();
           if (le != null)
           {
               System.out.println("linked exception "+le);
           }
        }
    

次の作業

アプリケーションのパッケージが完了した後で、 そのアプリケーションを Deploying a J2EEapplication to use JMS で説明されている方法で、WebSphere Application Server にデプロイすることができます。



関連タスク
JMS クライアントの開発
メッセージ駆動型 Bean を使用するエンタープライズ・アプリケーションの開発
JMS およびメッセージングを直接使用するためのプログラミング
関連資料
タスク・トピック    

ご利用条件 | フィードバック

最終更新: Jan 21, 2008 5:46:14 PM EST
http://publib.boulder.ibm.com/infocenter/wasinfo/v6r1/index.jsp?topic=/com.ibm.websphere.base.iseries.doc/info/iseries/ae/tmj_devap.html