JMS を使用するエンタープライズ・アプリケーションの開発

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

このタスクについて

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

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

エンタープライズ・アプリケーションで使用される JMS リソースの詳細は、WebSphere® Application Server に対して定義され、WebSphere 管理サポートによって JNDI 名前空間にバインドされます。

JMS を使用するには、以下の一般的なステップを実行します。

手順

  1. JMS パッケージをインポートします。 JMS を使用するエンタープライズ・アプリケーションは、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() を使用してメッセージを確認することはできません。createxxxSession 呼び出しで CLIENT_ACKNOWLEDGE の値が渡されると、メッセージは、アプリケーション・サーバーによって自動認識され、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);
           }
        }

次のタスク

アプリケーションのパッケージが完了した後で、そのアプリケーションを JMS を使用するエンタープライズ・アプリケーションのデプロイで説明している方法で、WebSphere Application Server にデプロイできます。

トピックのタイプを示すアイコン タスク・トピック



タイム・スタンプ・アイコン 最終更新: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tmj_devap
ファイル名:tmj_devap.html