ヘッダーをスキップ
Oracle® Fusion Middleware Oracle WebLogic Server JMSのプログラミング
12cリリース(12.1.1)
B65902-02
  ドキュメント・ライブラリへ移動
ライブラリ
製品リストへ移動
製品
目次へ移動
目次

前
 
次
 

5 基本的なJMSアプリケーションの開発

この章では、基本的なJMSアプリケーションの開発に必要な手順について説明します。

  1. 必要なパッケージのインポート

  2. JMSアプリケーションの設定

  3. メッセージの送信

  4. メッセージの受信

  5. 受信メッセージの確認応答

  6. オブジェクト・リソースの解放

上記のアプリケーション開発手順の他にも、設計開発時に以下の手順を任意に行うことができます。

必要なパッケージのインポート

次の表に、WebLogic JMSアプリケーションで一般に使用されるパッケージを示します。

表5-1 WebLogic JMSパッケージ

パッケージ名 説明
javax.jms

JMS API。このパッケージは常にWebLogic JMSアプリケーションで使用されます。http://download.oracle.com/javaee/5/api/javax/jms/package-summary.htmlを参照してください。

javax.naming
weblogic.jndi 

サーバーおよび宛先ルックアップに必要なJNDIパッケージ。http://download.oracle.com/javase/1.4.2/docs/api/javax/naming/package-summary.htmlを参照してください。

javax.transaction.UserTransaction

JTAユーザー・トランザクション・サポートに必要なJTA API。http://www.javasoft.com/products/jta/javadocs-1.0.1/javax/transaction/UserTransaction.htmlを参照してください。

weblogic.jms.extensions 

追加のクラスとメソッドを提供するWebLogic固有のJMSパブリックAPI (「JMSパブリックAPIの付加価値拡張機能」を参照)。

weblogic.jms.extensions.ServerSessionPoolFactory

WebLogic Server 8.1で非推奨になっています。


JMSアプリケーションの設定

メッセージを送受信するには、あらかじめJMSアプリケーションを設定しておく必要があります。次の図に、JMSアプリケーションの設定に必要な手順を示します。

図5-1 JMSアプリケーションの設定

図5-1の説明が続きます
「図5-1 JMSアプリケーションの設定」の説明

以下の節では、この設定手順について説明します。また、ポイント・ツー・ポイント(PTP)およびパブリッシュ/サブスクライブ(Pub/Sub)アプリケーションの詳しい例も示します。これらの例は、WL_HOME\samples\server\examples\src\examples\jmsディレクトリ(WL_HOMEはWebLogic Platformのインストール先の最上位ディレクトリ)にあるWebLogic Server付属のexamples.jmsパッケージからの抜粋です。

設定手順に進む前に、WebLogic Serverの構成を担当するシステム管理者が必要なJMSリソース(接続ファクトリ、JMSサーバー、宛先など)を構成したことを確認してください。

ステップ1: JNDIで接続ファクトリをルックアップする

接続ファクトリをルックアップするには、あらかじめ接続ファクトリを構成情報の一部として定義しておく必要があります。WebLogic JMSには、構成の一部として組み込まれているデフォルト接続ファクトリが2つ用意されています。このファクトリは、weblogic.jms.ConnectionFactory JNDI名とweblogic.jms.XAConnectionFactoryでルックアップできます(これらはJTAトランザクションを有効化します)。管理者は構成時に新しい接続ファクトリを構成できますが、これらのファクトリには一意の名前を付ける必要があります。そうしないとサーバーが起動しません。接続ファクトリの構成および使用できるデフォルトについては、Oracle WebLogic Server管理コンソール・オンライン・ヘルプ接続ファクトリの構成に関する項を参照してください。

接続ファクトリを定義したら、その接続ファクトリをルックアップするために、まずInitialContext()メソッド(http://download.oracle.com/javase/1.4.2/docs/api/javax/naming/InitialContext.html#InitialContext())を使用してJNDIコンテキスト(context)を確立します。サーブレット・アプリケーション以外のアプリケーションの場合は、初期コンテキストの作成に使用する環境を渡す必要があります。

コンテキストを定義したら、JNDIで接続ファクトリをルックアップするために、以下のコマンド(PTPまたはPub/Subメッセージング用)のいずれかを実行します。

QueueConnectionFactory queueConnectionFactory = 
 (QueueConnectionFactory) context.lookup(CF_name);

TopicConnectionFactory topicConnectionFactory = 
 (TopicConnectionFactory) context.lookup(CF_name);

CF_name引数には、構成時に定義した接続ファクトリ名を指定します。

ConnectionFactoryクラスの詳細は、「ConnectionFactory」またはjavax.jms.ConnectionFactoryのJavadoc (http://download.oracle.com/javaee/5/api/javax/jms/ConnectionFactory.html)を参照してください。

ステップ2: 接続ファクトリを使用して接続を作成する

メッセージング・システムにアクセスするための接続を作成するには、次節で説明するConnectionFactoryメソッドを使用します。

Connectionクラスの詳細は、「Connection」またはjavax.jms.ConnectionのJavadoc (http://download.oracle.com/javaee/5/api/javax/jms/Connection.html)を参照してください。

キュー接続の作成

QueueConnectionFactoryは、キュー接続を作成するための以下の2つのメソッドを提供します。

public QueueConnection createQueueConnection(
) throws JMSException

public QueueConnection createQueueConnection(
 String userName,
 String password
) throws JMSException

最初のメソッドはQueueConnectionを作成し、2番目のメソッドは指定されたユーザーIDを使用してQueueConnectionを作成します。どちらのケースでも、接続は停止モードで作成されます。メッセージを受け付けるには、「ステップ7: 接続を開始する」で説明するとおりに接続を開始しなければなりません。

QueueConnectionFactoryクラスのメソッドの詳細は、javax.jms.QueueConnectionFactoryのJavadoc (http://download.oracle.com/javaee/5/api/javax/jms/QueueConnectionFactory.html)を参照してください。QueueConnectionクラスの詳細は、javax.jms.QueueConnectionのJavadoc (http://download.oracle.com/javaee/5/api/javax/jms/QueueConnection.html)を参照してください。

トピック接続の作成

TopicConnectionFactoryは、トピック接続を作成するための、以下の2つのメソッドを提供します。

public TopicConnection createTopicConnection(
) throws JMSException

public TopicConnection createTopicConnection(
 String userName,
 String password
) throws JMSException

最初のメソッドはTopicConnectionを作成し、2番目のメソッドは指定されたユーザーIDを使用してTopicConnectionを作成します。どちらのケースでも、接続は停止モードで作成されます。メッセージを受け付けるには、「ステップ7: 接続を開始する」で説明するとおりに接続を開始しなければなりません。

TopicConnectionFactoryクラスのメソッドの詳細は、javax.jms.TopicConnectionFactoryのJavadoc (http://download.oracle.com/javaee/5/api/javax/jms/TopicConnectionFactory.html)を参照してください。TopicConnectionクラスの詳細は、javax.jms.TopicConnectionのJavadoc (http://download.oracle.com/javaee/5/api/javax/jms/TopicConnection.html)を参照してください。

ステップ3: 接続を使用してセッションを作成する

キューまたはトピックにアクセスするために1つまたは複数のセッションを作成するには、以降の節で説明するConnectionメソッドを使用します。


注意:

セッションおよびそのメッセージのプロデューサとコンシューマには、一度に1つのスレッドしかアクセスできません。それらに複数のスレッドが同時にアクセスした場合、それらの動作は不明確になります。

WebLogic JMSでは、単一のセッションでQueueConsumer型とTopicSubscriber型のMessageConsumerを一緒に使用することはできません。ただし、単一のセッションでQueueSender型とTopicSubscriber型(またはQueueConsumer型とTopicPublisher型)を1つずつ使用することは可能です。また、MessageProducerは型に関係なく複数使用できます。


Sessionクラスの詳細は、「Session」またはjavax.jms.SessionのJavadoc (http://download.oracle.com/javaee/5/api/javax/jms/Session.html)を参照してください。

キュー・セッションの作成

QueueConnectionクラスは、キュー・セッション作成用のメソッドを次のとおり定義します。

public QueueSession createQueueSession(
 boolean transacted,
 int acknowledgeMode
) throws JMSException

このメソッドでは、セッションをトランザクション処理するか(true)、またはトランザクション処理しないか(false)を示すブール引数と、非トランザクション・セッションの確認応答モードを示す整数値を指定する必要があります。トランザクション・セッションの場合、acknowledgeMode属性は無視されます。この場合、メッセージはcommit()メソッドでトランザクションがコミットされたときに確認応答されます。

QueueConnectionクラスのメソッドの詳細は、javax.jms.QueueConnectionのJavadoc (http://download.oracle.com/javaee/5/api/javax/jms/QueueConnection.html)を参照してください。QueueSessionクラスの詳細は、javax.jms.QueueSessionのJavadoc (http://download.oracle.com/javaee/5/api/javax/jms/QueueSession.html)を参照してください。

トピック・セッションの作成

TopicConnectionクラスは、トピック・セッション作成用のメソッドを次のとおり定義します。

public TopicSession createTopicSession(
 boolean transacted,
 int acknowledgeMode
) throws JMSException

このメソッドでは、セッションをトランザクション処理するか(true)、またはトランザクション処理しないか(false)を示すブール引数と、非トランザクション・セッションの確認応答モードを示す整数値を指定する必要があります。トランザクション・セッションの場合、acknowledgeMode属性は無視されます。この場合、メッセージはcommit()メソッドでトランザクションがコミットされたときに確認応答されます。

TopicConnectionクラスのメソッドの詳細は、javax.jms.TopicConnectionのJavadoc (http://download.oracle.com/javaee/5/api/javax/jms/TopicConnection.html)を参照してください。TopicSessionクラスの詳細は、javax.jms.TopicSessionのJavadoc (http://download.oracle.com/javaee/5/api/javax/jms/TopicSession.html)を参照してください。

ステップ4: 宛先(キューまたはトピック)をルックアップする

宛先をルックアップする場合、事前にWebLogic JMSシステム管理者によって宛先が構成されている必要があります。宛先の構成については、Oracle WebLogic Server管理コンソール・オンライン・ヘルプトピックの構成に関する項およびキューの構成に関する項で説明されています。Destinationクラスの詳細は、「Destination」またはjavax.jms.DestinationのJavadoc (http://download.oracle.com/javaee/5/api/javax/jms/Destination.html)を参照してください。

宛先が構成されていれば、以下のいずれかの手順を実行して宛先をルックアップできます。

JNDI名の使用

JNDIコンテキスト(context)を確立し(「ステップ1: JNDIで接続ファクトリをルックアップする」で実行済み)、以下のコマンド(PTPまたはPub/Subメッセージング用)のいずれかを実行することによって、宛先をルックアップできます。

Queue queue = (Queue) context.lookup(Dest_name);

Topic topic = (Topic) context.lookup(Dest_name);

Dest_name引数には、構成時に定義された宛先のJNDI名を指定します。

参照の使用

JNDIネームスペースを使用しない場合は、以下のQueueSessionまたはTopicSessionメソッドを使用してキューまたはトピックをそれぞれ参照できます。


注意:

createQueue()メソッドとcreateTopic()メソッドでは宛先が動的には作成されず、既存の宛先への参照のみが作成されます。宛先の動的な作成については、第7章「JMSモジュール・ヘルパーを使用したアプリケーションの管理」を参照してください。


public Queue createQueue(
 String queueName
) throws JMSException

public Topic createTopic(
 String topicName
) throws JMSException

JNDIの構文、createQueue()、およびcreateTopic()については、「宛先のルックアップ方法」を参照してください。

ステップ5: メッセージ・オブジェクトとメッセージ・コンシューマを作成する

メッセージ・プロデューサとメッセージ・コンシューマを作成するには、次節で説明するSessionメソッドに宛先の参照を渡します。


注意:

各コンシューマはメッセージの独自のローカル・コピーを受信します。受信が済んだら、ヘッダー・フィールド値を変更することはできますが、メッセージ・プロパティとメッセージ本文は読取り専用です。(この時点でメッセージ・プロパティまたは本文を変更しようとすると、MessageNotWriteableExceptionが発生します)。メッセージ本文を変更するには、対応するメッセージ・タイプのclearbody()メソッドを実行して、既存の内容を消去し、書込み権限を有効にします。


MessageProducerクラスとMessageConsumerクラスの詳細は、「MessageProducerとMessageConsumer」、またはjavax.jms.MessageProducer (http://download.oracle.com/javaee/5/api/javax/jms/MessageProducer.html)およびjavax.jms.MessageConsumerのJavadoc (http://download.oracle.com/javaee/5/api/javax/jms/MessageConsumer.html)を参照してください。

QueueSenderとQueueReceiverの作成

QueueSessionオブジェクトは、キュー・センダーとキュー・レシーバを作成するための、以下のメソッドを定義します。

public QueueSender createSender(
 Queue queue
) throws JMSException

public QueueReceiver createReceiver(
 Queue queue
) throws JMSException

public QueueReceiver createReceiver(
 Queue queue, 
 String messageSelector
) throws JMSException

作成するキュー・センダーまたはキュー・レシーバに関連付けるキュー・オブジェクトを指定しなければなりません。また、メッセージをフィルタ処理するためのメッセージ・セレクタを指定できます。メッセージ・セレクタの詳細は、「メッセージのフィルタ処理」を参照してください。

createSender()メソッドにnull値を渡すと、匿名プロデューサが作成されます。この場合、メッセージの送信で説明するように、メッセージの送信時にキュー名を指定しなければなりません。

キュー・センダーまたはキュー・レシーバの作成が済んだら、以下のQueueSenderメソッドまたはQueueReceiverメソッドを使用して、そのキュー・センダーまたはレシーバに関連付けられているキュー名にアクセスできます。

public Queue getQueue(
) throws JMSException

QueueSessionクラスのメソッドの詳細は、javax.jms.QueueSessionのJavadoc (http://download.oracle.com/javaee/5/api/javax/jms/QueueSession.html)を参照してください。QueueSenderクラスとQueueReceiverクラスの詳細は、javax.jms.QueueSender (http://download.oracle.com/javaee/5/api/javax/jms/QueueSender.html)およびjavax.jms.QueueReceiverのJavadoc (http://download.oracle.com/javaee/5/api/javax/jms/QueueReceiver.html)を参照してください。

TopicPublisherとTopicSubscriberの作成

TopicSessionオブジェクトは、トピック・パブリッシャとトピック・サブスクライバを作成するための、以下のメソッドを定義します。

public TopicPublisher createPublisher(
 Topic topic
) throws JMSException

public TopicSubscriber createSubscriber(
 Topic topic
) throws JMSException

public TopicSubscriber createSubscriber(
 Topic topic, 
 String messageSelector, 
 boolean noLocal
) throws JMSException

注意:

この節で説明するメソッドでは、非恒久サブスクライバが作成されます。非恒久トピック・サブスクライバは、アクティブな間だけメッセージを受信します。恒久サブスクリプションを作成して、すべてのメッセージが恒久サブスクライバに届けられるまでメッセージを保持できるようにするためのメソッドについては、「恒久サブスクリプション用のサブスクライバの作成」を参照してください。この場合、恒久サブスクライバはサブスクライバがサブスクライブした後にパブリッシュされたメッセージのみを受信します。


作成するパブリッシャまたはサブスクライバに関連付けるトピック・オブジェクトを指定しなければなりません。また、メッセージをフィルタ処理するためのメッセージ・セレクタ、およびnoLocalフラグ(この節で後述)を指定することもできます。メッセージ・セレクタの詳細は、「メッセージのフィルタ処理」を参照してください。

createPublisher()メソッドにnull値を渡すと、匿名プロデューサが作成されます。この場合、メッセージの送信で説明するように、メッセージの送信時にトピック名を指定しなければなりません。

アプリケーションは、JMS接続を使用して同じトピックに対してパブリッシュとサブスクライブの両方を行う場合があります。トピック・メッセージはすべてのサブスクライバに届けられるので、アプリケーションは自身がパブリッシュしたことを示すメッセージを受信する可能性があります。この動作を防ぐために、JMSアプリケーションはnoLocalフラグをtrueに設定できます。

トピック・パブリッシャまたはトピック・サブスクライバの作成が済んだら、以下のTopicPublisherメソッドまたはTopicSubscriberメソッドを使用して、そのトピック・パブリッシャまたはサブスクライバに関連付けられているトピック名にアクセスできます。

Topic getTopic(
) throws JMSException

また、次のTopicSubscriberメソッドを使用すると、トピック・サブスクライバに関連付けられるnoLocal変数の設定値にアクセスできます。

boolean getNoLocal(
) throws JMSException

TopicSessionクラスのメソッドの詳細は、javax.jms.TopicSessionのJavadoc (http://download.oracle.com/javaee/5/api/javax/jms/TopicSession.html)を参照してください。TopicPublisherクラスとTopicSubscriberクラスの詳細は、javax.jms.TopicPublisher (http://download.oracle.com/javaee/5/api/javax/jms/TopicPublisher.html)およびjavax.jms.TopicSubscriberのJavadoc (http://download.oracle.com/javaee/5/api/javax/jms/TopicSubscriber.html)を参照してください。

ステップ6a: メッセージ・オブジェクトを作成する(メッセージ・プロデューサ)


注意:

この手順は、メッセージ・プロデューサだけに適用されます。


メッセージ・オブジェクトを作成するには、以下のSessionクラス・メソッドまたはWLSessionクラス・メソッドのいずれかを使用します。

  • Sessionメソッド


    注意:

    これらのメソッドは、QueueSessionサブクラスとTopicSessionサブクラスの両方によって継承されます。


    public BytesMessage createBytesMessage(
    ) throws JMSException
    
    public MapMessage createMapMessage(
    ) throws JMSException
    
    public Message createMessage(
    ) throws JMSException
    
    public ObjectMessage createObjectMessage(
    ) throws JMSException
    
    public ObjectMessage createObjectMessage(
     Serializable object
    ) throws JMSException
    
    public StreamMessage createStreamMessage(
    ) throws JMSException
    
    public TextMessage createTextMessage(
    ) throws JMSException
    
    public TextMessage createTextMessage(
     String text
    ) throws JMSException
    
  • WLSessionメソッド

    public XMLMessage createXMLMessage(
     String text
    ) throws JMSException
    

SessionクラスおよびWLSessionクラスのメソッドの詳細は、それぞれjavax.jms.SessionのJavadoc (http://download.oracle.com/javaee/5/api/javax/jms/Session.html)およびweblogic.jms.extensions.WLSessionのJavadocを参照してください。Messageクラスとそのメソッドの詳細は、「Message」またはjavax.jms.MessageのJavadoc (http://download.oracle.com/javaee/5/api/javax/jms/Message.html)を参照してください。

ステップ6b: 非同期メッセージ・リスナーを登録する(オプション)


注意:

この手順は、メッセージ・コンシューマだけに適用されます。


メッセージを非同期的に受信するには、次の手順で非同期メッセージ・リスナーを登録する必要があります。

  1. onMessage()メソッドを持つインタフェースjavax.jms.MessageListener (http://download.oracle.com/javaee/5/api/javax/jms/MessageListener.html)を実装します。


    注意:

    onMessage()メソッドのインタフェースの例については、「例: PTPアプリケーションの設定」を参照してください。

    onMessage()メソッド呼出し内でclose()メソッドを発行する場合、システム管理者は接続ファクトリを構成するときに「onMessage()でのcloseを許可」オプションを選択する必要があります。接続ファクトリ・オプションの構成の詳細は、『Oracle WebLogic Server JMSの構成と管理』の基本JMSシステム・リソースの構成に関する項を参照してください。


  2. 次のMessageConsumerメソッドを使用してメッセージ・リスナーを設定し、リスナー情報を引数として渡します。

    public void setMessageListener(
     MessageListener listener
    ) throws JMSException
    
  3. 必要に応じて、「接続例外リスナーの定義」で説明するように、例外を取得するためのセッションの例外リスナーを実装します。

メッセージ・リスナーの設定を解除するには、null値を指定してMessageListener()メソッドを呼び出します。

メッセージ・リスナーを定義したら、次のMessageConsumerメソッドを呼び出してそのリスナーにアクセスできます。

public MessageListener getMessageListener(
) throws JMSException

注意:

WebLogic JMSは、同じセッションの複数のonMessage()呼出しが同時に実行されないことを保証します。


メッセージ・コンシューマが管理者またはサーバー障害によってクローズされた場合、ConsumerClosedExceptionがセッション例外リスナーに送信されます(定義されている場合)。このように、必要な場合は新しいメッセージ・コンシューマを作成できます。セッション例外リスナーの定義については、「セッション例外リスナーの定義」を参照してください。

MessageConsumerクラスのメソッドは、QueueReceiverおよびTopicSubscriberクラスによって継承されます。MessageConsumerクラスのメソッドの詳細は、「MessageProducerとMessageConsumer」またはjavax.jms.MessageConsumerのJavadoc (http://download.oracle.com/javaee/5/api/javax/jms/MessageConsumer.html)を参照してください。

ステップ7: 接続を開始する

接続を開始するには、Connectionクラスのstart()メソッドを使用します。

接続の開始、停止、およびクローズの詳細は、「接続の開始、停止、クローズ」またはjavax.jms.ConnectionのJavadoc (http://download.oracle.com/javaee/5/api/javax/jms/Connection.html)を参照してください。

例: PTPアプリケーションの設定

次の例は、WL_HOME\samples\server\examples\src\examples\jms\queueディレクトリ(WL_HOMEはWebLogic Platformのインストール先の最上位ディレクトリ)にあるWebLogic Server付属のexamples.jms.queue.QueueSendサンプルからの抜粋です。init()メソッドは、JMSアプリケーションのQueueSessionをどのように設定して開始するかを示すものです。次に、そのinit()メソッドを示し、あわせて各設定手順も述べます。

必要な変数(JNDIコンテキストなど)、JMS接続ファクトリ、およびキュー静的変数を定義します。

public final static String JNDI_FACTORY=
       "weblogic.jndi.WLInitialContextFactory";
public final static String JMS_FACTORY=
       "weblogic.examples.jms.QueueConnectionFactory";
public final static String 
        QUEUE="weblogic.examples.jms.exampleQueue";

private QueueConnectionFactory qconFactory;
private QueueConnection qcon;
private QueueSession qsession;
private QueueSender qsender;
private Queue queue;
private TextMessage msg;

JNDI初期コンテキストを次のとおり設定します。

InitialContext ic = getInitialContext(args[0]);
       .
       .
       .
private static InitialContext getInitialContext(
 String url
) throws NamingException
{
 Hashtable env = new Hashtable();
 env.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_FACTORY);
 env.put(Context.PROVIDER_URL, url);
 return new InitialContext(env);
}

注意:

EJBまたはサーブレットのJNDI初期コンテキストを設定する場合は、以下のメソッドを使用します。

Context ctx = new InitialContext();


JMSキューにメッセージを送信するのに必要なすべてのオブジェクトを作成します。ctxオブジェクトは、main()メソッドによって渡されたJNDI初期コンテキストです。

public void init(
 Context ctx, 
 String queueName
) throws NamingException, JMSException
{

ステップ1

JNDIで接続ファクトリをルックアップします。

 qconFactory = (QueueConnectionFactory) ctx.lookup(JMS_FACTORY);

ステップ2

接続ファクトリを使用して接続を作成します。

 qcon = qconFactory.createQueueConnection(); 

ステップ3

接続を使用してセッションを作成します。次のコードでは、セッションが非トランザクションとして定義され、メッセージに対する確認応答が自動的に行われるものと指定されます。トランザクション・セッションと確認応答モードの詳細は、「Session」を参照してください。

 qsession = qcon.createQueueSession(false,
 Session.AUTO_ACKNOWLEDGE);

ステップ4

JNDIで宛先(キュー)をルックアップします。

 queue = (Queue) ctx.lookup(queueName);

ステップ5

セッションと宛先(キュー)を使用してメッセージ・プロデューサ(キュー・センダー)への参照を作成します。

 qsender = qsession.createSender(queue);

ステップ6

メッセージ・オブジェクトを作成します。

 msg = qsession.createTextMessage();

ステップ7

接続を開始します。

 qcon.start();
}

examples.jms.queue.QueueReceiveの例のinit()メソッドは、前記のQueueSend init()メソッドとほぼ同じですが、例外が1つあります。ステップ5とステップ6は、それぞれ以下のコードに置き換えられます。

qreceiver = qsession.createReceiver(queue);
qreceiver.setMessageListener(this);

最初の行では、createSender()メソッドを呼び出してキュー・センダーへの参照を作成するかわりに、アプリケーションはcreateReceiver()メソッドを呼び出してキュー・レシーバを作成します。

2番目の行では、メッセージ・コンシューマは非同期メッセージ・リスナーを登録します。

メッセージがキュー・セッションに届くと、そのメッセージはexamples.jms.QueueReceive.onMessage()メソッドに渡されます。次のQueueReceiveの例からの引用コードは、onMessage()インタフェースを示したものです。

public void onMessage(Message msg)
{
 try {
       String msgText;
       if (msg instanceof TextMessage) {
          msgText = ((TextMessage)msg).getText();
       } else { // If it is not a TextMessage...
        msgText = msg.toString();
       }

       System.out.println("Message Received: "+ msgText );

       if (msgText.equalsIgnoreCase("quit")) {
         synchronized(this) {

                quit = true;
              this.notifyAll(); // Notify main thread to quit
         }
       }
  } catch (JMSException jmse) {
   jmse.printStackTrace();
  }
}

onMessage()メソッドは、キュー・レシーバを通して受信したメッセージを処理します。このメソッドは、メッセージがTextMessageであるかどうかを検証し、そうである場合は、そのメッセージのテキストを印刷します。onMessage()が別のタイプのメッセージを受信した場合、そのメッセージのtoString()メソッドを使用してメッセージの内容を表示します。


注意:

受信したメッセージのタイプが、メッセージ・ハンドラ・メソッドが予期したタイプであるかどうかを検証するようにしてください。


この例で使用されているJMSクラスの詳細は、「JMS APIについて」またはjavax.jmsのJavadoc (http://www.oracle.com/technetwork/java/jms/index.html)を参照してください。

例: Pub/Subアプリケーションの設定

次の例は、WL_HOME\samples\server\examples\src\examples\jms\topicディレクトリ(WL_HOMEはWebLogic Platformのインストール先の最上位ディレクトリ)にあるWebLogic Server付属のexamples.jms.topic.TopicSendサンプルからの抜粋です。init()メソッドは、JMSアプリケーションのトピック・セッションをどのように設定して開始するかを示すものです。次に、そのinit()メソッドを示し、あわせて各設定手順も述べます。

必要な変数(JNDIコンテキストなど)、JMS接続ファクトリ、およびトピック静的変数を定義します。

public final static String JNDI_FACTORY=
       "weblogic.jndi.WLInitialContextFactory";
public final static String JMS_FACTORY=
       "weblogic.examples.jms.TopicConnectionFactory";
public final static String 
       TOPIC="weblogic.examples.jms.exampleTopic";

protected TopicConnectionFactory tconFactory;
protected TopicConnection tcon;
protected TopicSession tsession;
protected TopicPublisher tpublisher;
protected Topic topic;
protected TextMessage msg;

JNDI初期コンテキストを次のとおり設定します。

InitialContext ic = getInitialContext(args[0]);
       .
       .
       .
private static InitialContext getInitialContext(
 String url
) throws NamingException
{
  Hashtable env = new Hashtable();
  env.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_FACTORY);
  env.put(Context.PROVIDER_URL, url);
  return new InitialContext(env);
}

注意:

サーブレットのJNDI初期コンテキストを設定する場合は、以下のメソッドを使用します。

Context ctx = new InitialContext();


JMSキューにメッセージを送信するのに必要なすべてのオブジェクトを作成します。ctxオブジェクトは、main()メソッドによって渡されたJNDI初期コンテキストです。

public void init(
 Context ctx, 
 String topicName
) throws NamingException, JMSException
{

ステップ1

JNDIを使用して接続ファクトリをルックアップします。

  tconFactory = 
   (TopicConnectionFactory) ctx.lookup(JMS_FACTORY);

ステップ2

接続ファクトリを使用して接続を作成します。

  tcon = tconFactory.createTopicConnection();

ステップ3

接続を使用してセッションを作成します。次のコードでは、セッションが非トランザクションとして定義され、メッセージに対する確認応答が自動的に行われるものと指定されます。セッションのトランザクションと確認応答モードの設定については、「Session」を参照してください。

  tsession = tcon.createTopicSession(false,
   Session.AUTO_ACKNOWLEDGE);

ステップ4

JNDIを使用して宛先(トピック)をルックアップします。

  topic = (Topic) ctx.lookup(topicName);

ステップ5

セッションと宛先(トピック)を使用してメッセージ・プロデューサ(トピック・パブリッシャ)への参照を作成します。

  tpublisher = tsession.createPublisher(topic);

ステップ6

メッセージ・オブジェクトを作成します。

  msg = tsession.createTextMessage();

ステップ7

接続を開始します。

  tcon.start();
 }

examples.jms.topic.TopicReceiveの例のinit()メソッドは、前記のTopicSend init()メソッドとほぼ同じですが、例外が1つあります。ステップ5とステップ6は、それぞれ以下のコードに置き換えられます。

tsubscriber = tsession.createSubscriber(topic);
tsubscriber.setMessageListener(this);

最初の行では、createPublisher()メソッドを呼び出してトピック・パブリッシャへの参照を作成するかわりに、アプリケーションはcreateSubscriber()メソッドを呼び出してトピック・サブスクライバを作成します。

2番目の行では、メッセージ・コンシューマは非同期メッセージ・リスナーを登録します。

メッセージがトピック・セッションに届くと、そのメッセージはexamples.jms.TopicSubscribe.onMessage()メソッドに渡されます。TopicReceiveの例のonMessage()インタフェースは、QueueReceive onMessage()インタフェース(「例: PTPアプリケーションの設定」を参照)と同じです。

この例で使用されているJMSクラスの詳細は、「JMS APIについて」またはjavax.jmsのJavadoc (http://www.oracle.com/technetwork/java/jms/index.html)を参照してください。

メッセージの送信

「JMSアプリケーションの設定」の説明に従ってJMSアプリケーションを設定すると、メッセージを送信できるようになります。メッセージを送信するには、以下の節で説明する手順を順番どおりに実行する必要があります。

  1. メッセージ・オブジェクトを作成する

  2. メッセージを定義する

  3. メッセージを宛先に送信する

メッセージの送信に使用するJMSクラスとメッセージ・タイプの詳細は、javax.jms.MessageのJavadoc (http://download.oracle.com/javaee/5/api/javax/jms/Message.html)を参照してください。メッセージの受信については、「メッセージの受信」を参照してください。

メッセージ・オブジェクトを作成する

この手順は、「ステップ6a: メッセージ・オブジェクトを作成する(メッセージ・プロデューサ)」で説明したように、クライアント設定手順の一部としてすでに完了しています。

メッセージを定義する

この手順は、「ステップ6a: メッセージ・オブジェクトを作成する(メッセージ・プロデューサ)」で説明したように、アプリケーションの設定時に完了している場合もあります。この手順が完了しているかどうかは、メッセージ・オブジェクトを作成するために呼び出されたメソッドによって決まります。たとえば、TextMessageタイプとObjectMessageタイプの場合は、メッセージ・オブジェクトを作成するときにオプションでメッセージを定義することができます。

すでに値が指定されており、それを変更しない場合は、そのままステップ3に進みます。

値が指定されていない場合、または既存の値を変更する場合は、適切なsetメソッドを使用して値を定義できます。たとえば、TextMessageのテキストを定義するメソッドは次のとおりです。

public void setText(
 String string
) throws JMSException

注意:

メッセージはnullとして定義することができます。


それ以後は、次のメソッドを使用してメッセージを消去できます。

public void clearBody(
) throws JMSException

メッセージの定義に使用するメソッドの詳細は、javax.jms.SessionのJavadoc (http://download.oracle.com/javaee/5/api/javax/jms/Session.html)を参照してください。

メッセージを宛先に送信する

メッセージを宛先に送信するには、メッセージ・プロデューサ、つまりキュー・センダー(PTP)またはトピック・パブリッシャ(Pub/Sub)と、以下の節で説明するメソッドを使用します。DestinationオブジェクトとMessageProducerオブジェクトは、「JMSアプリケーションの設定」で説明したとおり、アプリケーションの設定時に作成されています。


注意:

複数のトピック・サブスクライバが同じトピックに対して定義されている場合、各サブスクライバはメッセージの独自のローカル・コピーを受信します。受信が済んだら、ヘッダー・フィールド値を変更することはできますが、メッセージ・プロパティとメッセージ本文は読取り専用です。メッセージ本文を変更するには、対応するメッセージ・タイプのclearbody()メソッドを実行して、既存の内容を消去し、書込み権限を有効にします。


MessageProducerクラスの詳細は、「MessageProducerとMessageConsumer」またはjavax.jms.MessageProducerのJavadoc (http://download.oracle.com/javaee/5/api/javax/jms/MessageProducer.html)を参照してください。

キュー・センダーを使用してメッセージを送信する

メッセージを送信するには、以下のQueueSenderメソッドを使用します。

public void send(
 Message message
) throws JMSException

public void send(
 Message message, 
 int deliveryMode, 
 int priority,
 long timeToLive
) throws JMSException

public void send(
 Queue queue, 
 Message message
) throws JMSException

public void send(
 Queue queue, 
 Message message, 
 int deliveryMode,
 int priority, 
 long timeToLive
) throws JMSException

メッセージを指定する必要があります。また、キュー名(匿名メッセージ・プロデューサ用)、配信モード(DeliveryMode.PERSISTENTまたはDeliveryMode.NON_PERSISTENT)、優先度(0-9)、および存続時間(ミリ秒単位)も指定できます。指定しない場合、配信モード、優先度、および存続時間の各属性は以下のいずれかに設定されます。

  • プロデューサに対して定義された接続ファクトリまたは宛先オーバーライド構成属性(Oracle WebLogic Server管理コンソール・オンライン・ヘルプデフォルトの配信パラメータの構成に関する項を参照)。

  • メッセージ・プロデューサのsetメソッドによって指定された値(「メッセージ・プロデューサ属性の設定」を参照)


    注意:

    WebLogic JMSでは、以下に示す独自の属性も提供されています(「メッセージ・プロデューサ属性の設定」を参照)。

    • TimeToDeliver (生成時間)。この属性は、送信されたメッセージがその宛先に到着するまでの遅延を表します。

    • RedeliveryLimit。この属性は、回復またはロールバック後のメッセージの再送信の回数を指定します。

    • SendTimeout。この属性は、メッセージの送信時にプロデューサがスペースの空きを待つ最長時間です。


配信モードをPERSISTENTとして定義した場合、Oracle WebLogic Server管理コンソール・オンライン・ヘルプ永続ストアの構成に関する項で説明しているように、宛先のバッキング・ストアを構成する必要があります。


注意:

バッキング・ストアが構成されていない場合、配信モードはNON_PERSISTENTに変更され、メッセージは永続ストアに書き込まれません。


キュー・センダーが匿名プロデューサである場合(つまり、キューが作成されたときにその名前がNULLに設定された場合)、キュー名を指定して(最後の2つのメソッドのいずれかを使用する)メッセージの配信先を指示する必要があります。匿名プロデューサの定義の詳細は、「QueueSenderとQueueReceiverの作成」を参照してください。

たとえば、次のコードは、永続的メッセージを優先度4、存続時間1時間で送信します。

QueueSender.send(message, DeliveryMode.PERSISTENT, 4, 3600000);

QueueSenderクラスのメソッドの詳細は、javax.jms.QueueSenderのJavadoc (http://download.oracle.com/javaee/5/api/javax/jms/QueueSender.html)を参照してください。

TopicPublisherを使用してメッセージを送信する

メッセージを送信するには、以下のTopicPublisherメソッドを使用します。

public void publish(
 Message message
) throws JMSException

public void publish(
 Message message, 
 int deliveryMode,
 int priority, 
 long timeToLive
) throws JMSException

public void publish(
 Topic topic, 
 Message message
) throws JMSException

public void publish(
 Topic topic, 
 Message message, 
 int deliveryMode,
 int priority, 
 long timeToLive
) throws JMSException

メッセージを指定する必要があります。また、トピック名、配信モード(DeliveryMode.PERSISTENTまたはDeliveryMode.NON_PERSISTENT)、優先度(0-9)、および存続時間(ミリ秒単位)を指定することもできます。指定しない場合、配信モード、優先度、および存続時間の各属性は以下のいずれかに設定されます。

  • プロデューサに対して定義された接続ファクトリまたは宛先オーバーライド構成属性(Oracle WebLogic Server管理コンソール・オンライン・ヘルプデフォルトの配信パラメータの構成に関する項を参照)。

  • メッセージ・プロデューサのsetメソッドによって指定された値(「メッセージ・プロデューサ属性の設定」を参照)


    注意:

    WebLogic JMSでは、以下に示す独自の属性も提供されています(「メッセージ・プロデューサ属性の設定」を参照)。

    • TimeToDeliver (生成時間)。この属性は、送信されたメッセージがその宛先に到着するまでの遅延を表します。

    • RedeliveryLimit。この属性は、回復またはロールバック後のメッセージの再送信の回数を指定します。

    • SendTimeout。この属性は、メッセージの送信時にプロデューサがスペースの空きを待つ最長時間です。


配信モードをPERSISTENTとして定義した場合、Oracle WebLogic Server管理コンソール・オンライン・ヘルプカスタム永続ストアの構成に関する項で説明しているように、バッキング・ストアを構成する必要があります。


注意:

バッキング・ストアが構成されていない場合、配信モードはNON_PERSISTENTに変更され、メッセージは保存されません。


トピック・パブリッシャが匿名プロデューサである場合(つまり、トピックが作成されたときにその名前がNULLに設定された場合)、トピック名を指定して(最後の2つのメソッドのいずれかを使用する)メッセージの配信先を指示する必要があります。匿名プロデューサの定義の詳細は、「TopicPublisherとTopicSubscriberの作成」を参照してください。

たとえば、次のコードは、永続的メッセージを優先度4、存続時間1時間で送信します。

TopicPublisher.publish(message, DeliveryMode.PERSISTENT, 
 4,3600000);

TopicPublisherクラスのメソッドの詳細は、javax.jms.TopicPublisherのJavadoc (http://download.oracle.com/javaee/5/api/javax/jms/TopicPublisher.html)を参照してください。

メッセージ・プロデューサ属性の設定

前項で説明したように、メッセージを送信するときには、配信モード、優先度、および存続時間をオプションで指定できます。指定しない場合、これらの属性には接続ファクトリの構成属性の値が設定されます。詳細は、Oracle WebLogic Server管理コンソール・オンライン・ヘルプ接続ファクトリの構成に関する項を参照してください。

かわりに、メッセージ・プロデューサのsetメソッドを使用して、配信モード、優先度、配信時間、存続時間、再配信遅延(タイムアウト)、および再配信制限の各属性値を動的に設定できます。次の表に、メッセージ・プロデューサのsetメソッドとgetメソッドを、動的構成可能な属性ごとに示します。


注意:

配信モード、優先度、存続時間、配信時間、再配信遅延(タイムアウト)、および再配信制限の各属性値は、「配信モードのオーバーライド」、「優先度のオーバーライド」、存続時間のオーバーライド、配信時間のオーバーライド、「再配信遅延のオーバーライド」、および「再配信の制限」の各構成属性を使用して宛先によってオーバーライドできます。詳細は、Oracle WebLogic Server管理コンソール・オンライン・ヘルプメッセージ配信のオーバーライドの構成に関する項およびトピック・メッセージ配信のオーバーライドの構成に関する項を参照してください。


表5-2 メッセージ・プロデューサのsetメソッドおよびgetメソッド

属性 setメソッド getメソッド

配信モード

public void setDeliveryMode(
 int deliveryMode
) throws JMSException
public int getDeliveryMode(
) throws JMSException

優先度

public void setPriority(
 int defaultPriority
) throws JMSException
public int getPriority(
) throws JMSException

存続時間

public void setTimeToLive(
 long timeToLive
) throws JMSException
public long getTimeToLive(
) throws JMSException

配信時間

public void setTimeToDeliver(
 long timeToDeliver
) throws JMSException
public long getTimeToDeliver(
) throws JMSException

再配信の制限

public void setRedeliveryLimit(
 int redeliveryLimit
) throws JMSException
public int getredeliveryLimit(
) throws JMSException

送信タイムアウト

public void setsendTimeout(
long sendTimeout
) throws JMSException
public long getsendTimeout(
) throws JMSException


注意:

JMSでは、メッセージIDとタイムスタンプ情報を無効にするためのMessageProducerメソッドを定義することもできます。ただし、これらのメソッドはWebLogic JMSでは無視されます。


MessageProducerクラスのメソッドの詳細は、javax.jms.MessageProducerのJavadoc (http://download.oracle.com/javaee/5/api/javax/jms/MessageProducer.html)またはweblogic.jms.extensions.WLMessageProducerのJavadocを参照してください。

例: PTPアプリケーション内でのメッセージの送信

次の例は、WL_HOME\samples\server\examples\src\examples\jms\queueディレクトリ(WL_HOMEはWebLogic Platformのインストール先の最上位ディレクトリ)にあるWebLogic Server付属のexamples.jms.queue.QueueSendサンプルからの抜粋です。この例では、TextMessageを作成し、メッセージのテキストを設定してキューに送信するために必要なコードを示してあります。

msg = qsession.createTextMessage();
       .
       .
       .
public void send(
 String message
) throws JMSException
{
 msg.setText(message);
 qsender.send(msg);
}

QueueSenderクラスとメソッドの詳細は、javax.jms.QueueSenderのJavadoc (http://download.oracle.com/javaee/5/api/javax/jms/QueueSender.html)を参照してください。

例: Pub/Subアプリケーション内でのメッセージの送信

次の例は、WL_HOME\samples\server\examples\src\examples\jms\topicディレクトリ(WL_HOMEはWebLogic Platformのインストール先の最上位ディレクトリ)にあるWebLogic Server付属のexamples.jms.topic.TopicSendサンプルからの抜粋です。この例では、TextMessageを作成し、メッセージのテキストを設定してトピックに送信するために必要なコードを示してあります。

msg = tsession.createTextMessage();
       .
       .
       .
public void send(
 String message
) throws JMSException
{
 msg.setText(message);
 tpublisher.publish(msg);
}

TopicPublisherクラスとメソッドの詳細は、javax.jms.TopicPublisherのJavadoc (http://download.oracle.com/javaee/5/api/javax/jms/TopicPublisher.html)を参照してください。

メッセージの受信

「JMSアプリケーションの設定」の説明に従ってJMSアプリケーションを設定すると、メッセージを受信できるようになります。

メッセージを受信するには、以下の節で説明するとおりレシーバ・オブジェクトを作成し、メッセージを同期受信するか非同期受信するかを指定する必要があります。

メッセージを受信する順序は、以下の要素によって設定できます。

受信が済んだら、ヘッダー・フィールド値を変更することはできますが、メッセージ・プロパティとメッセージ本文は読取り専用です。メッセージ本文を変更するには、対応するメッセージ・タイプのclearbody()メソッドを実行して、既存の内容を消去し、書込み権限を有効にします。

メッセージの受信に使用するJMSクラスとメッセージ・タイプの詳細は、javax.jms.MessageのJavadoc (http://download.oracle.com/javaee/5/api/javax/jms/Message.html)を参照してください。メッセージの送信については、「メッセージの送信」を参照してください。

メッセージの非同期受信

この手順については、アプリケーションの設定手順の中で説明されています。詳細は、「ステップ6b: 非同期メッセージ・リスナーを登録する(オプション)」を参照してください。


注意:

接続ファクトリの構成時に「セッションあたりの最大メッセージ数」属性を設定すると、非同期コンシューマに存在し、メッセージ・リスナーにまだ渡されていないメッセージの最大数を指定できます。


非同期メッセージ・パイプライン

メッセージの生成速度が非同期メッセージ・リスナー(コンシューマ)によるそれらの消費速度を上回る場合、JMSサーバーは複数の未消費メッセージをまとめ、別の使用可能な非同期メッセージ・リスナーのセッションに送ります。こうした処理中のメッセージはメッセージ・パイプラインと呼ばれ、JMSベンダーによってはメッセージ・バックログとも呼ばれます。パイプラインまたはバックログのサイズは、非同期コンシューマで蓄積され、メッセージ・リスナーに渡されていないメッセージの数です。

メッセージ・パイプラインの構成

クライアントの最大パイプライン・サイズを設定するには、クライアントの接続ファクトリのセッションあたりの最大メッセージ数属性を構成します。この属性は、非同期コンシューマに存在し、メッセージ・リスナーにまだ渡されていないメッセージの最大数です。デフォルト値は10です。JMS接続ファクトリの構成の詳細は、Oracle WebLogic Server管理コンソール・オンライン・ヘルプ接続ファクトリの構成に関する項を参照してください。

パイプライン・メッセージの動作

構成されたメッセージ・パイプラインは、次のように動作します。

  • 統計 - JMSモニター統計では、メッセージ・パイプラインのバックログ・メッセージは、コミットまたは確認応答されるまで保留中(キューおよび恒久サブスクライバに対して)として報告されます。

  • パフォーマンス - 「セッションあたりの最大メッセージ数」パイプライン・サイズを増やすと、高スループット・アプリケーションのパフォーマンスが向上する場合があります。パイプライン・サイズを増やすと、クライアントのメモリー使用率が高くなります。これは、非同期コンシューマのリスナーが呼び出されるまで保留中のパイプライン・メッセージがクライアントJVMに蓄積されるからです。

  • ソート - 非同期コンシューマのパイプライン内のメッセージは、コンシューマ宛先の構成済みソート順序に従ってソートされず、JMSサーバーから送信された順序を保持します。たとえば、宛先のソート順序が優先度である場合でも、優先度が最も高いメッセージが、非同期コンシューマのパイプラインにすでに送信されている優先度の低いメッセージの前に来ることはありません。


    注意:

    接続ファクトリの「セッションあたりの最大メッセージ数」パイプライン・サイズは、JMSサーバーおよび宛先の最大メッセージ割当ての設定とは関係ありません。

    パイプライン・メッセージは、ネットワーク・トランスポートで単一のメッセージに集約される場合があります。パイプライン・メッセージのサイズが大きい場合、書き込まれるデータの集約サイズが最大トランスポート値を超え、望ましくない動作が発生する場合があります。たとえば、t3プロトコルでは、デフォルトの最大メッセージ・サイズは10,000,000バイトに設定されており、サーバーのMaxT3MessageSize属性で構成できます。このため、10通の2 MBメッセージがパイプライン処理される場合、t3の制限を上回る場合があります。


メッセージの同期受信

メッセージを同期的に受信するには、以下のMessageConsumerメソッドを使用します。

public Message receive(
) throws JMSException

public Message receive(
 long timeout
) throws JMSException

public Message receiveNoWait(
) throws JMSException

どのケースでも、アプリケーションは次に生成されるメッセージを受信します。receive()メソッドを引数なしで呼び出した場合、その呼出しはメッセージが生成されるか、またはアプリケーションがクローズされるまで無期限にブロックされます。代わりに、タイムアウト値を渡してメッセージの待ち時間を指定することもできます。値0を指定してreceive()メソッドを呼び出した場合、その呼出しは無期限にブロックされます。receiveNoWait()メソッドは、次のメッセージが存在する場合はそれを受信し、それ以外の場合はnullを返します。この場合、呼出しはブロックされません。

MessageConsumerクラスのメソッドは、QueueReceiverおよびTopicSubscriberクラスによって継承されます。MessageConsumerクラスのメソッドの詳細は、javax.jms.MessageConsumerのJavadoc (http://download.oracle.com/javaee/5/api/javax/jms/MessageConsumer.html)を参照してください。

プリフェッチ・モードを使用した同期メッセージ・パイプラインの作成

WebLogic Server 9.1より前のバージョンでは、同期コンシューマで各メッセージに対し双方向のネットワーク呼出しが必要でした。この方法は同期コンシューマで複数のメッセージを受け取れないので非効率的であり、また同期コンシューマで利用可能なメッセージ用にサーバーのポーリングが続けられるのでネットワーク・トラフィック・リソースが増加するおそれがありました。WebLogic 9.1以降では、管理コンソールまたはJMSClientParamsBean MBeanを介してJMS接続ファクトリの「同期コンシューマのプリフェッチ・モード」オプションを有効にすることにより、同期コンシューマでも非同期コンシューマと同じ効率的な動作を利用できるようになります。

JMSクライアントの接続ファクトリでプリフェッチ・モードが有効な場合、非同期メッセージのパイプラインのように、その接続ファクトリにターゲット指定されたJMSサーバーが未消費のメッセージのバッチを積極的に同期メッセージ・コンシューマに送信します。この際、バッチごとにプリフェッチされるメッセージの最大数を定義するために、その接続ファクトリの「セッションあたりの最大メッセージ数」パラメータが使用されます。これにより、同期コンシューマでさらにメッセージを処理する準備ができたときに、そのコンシューマに対してメッセージが用意され待機している状態になるため、パフォーマンスが向上する場合があります。さらに、コンシューマでメッセージのポーリングが続けられることがなく、コンシューマからの同期呼出し数が減るので、ネットワーク・トラフィックが減少することもあります。

同期メッセージ・プリフェッチは、同期メッセージ受信に対するユーザー(XA)トランザクションも、(キューであるかトピックであるかに関係なく)セッションごとの複数の同期コンシューマもサポートしていません。上記に該当するほとんどの場合、WebLogic JMSでは何の通知もなく「同期コンシューマのプリフェッチ・モード」フラグは無視されます。ただし、無視されない場合、アプリケーションの同期受信呼出しは失敗します。

パイプライン・メッセージの動作の詳細は、「非同期メッセージ・パイプライン」を参照してください。JMS接続ファクトリの構成の詳細は、Oracle WebLogic Server管理コンソール・ヘルプ接続ファクトリの構成に関する項を参照してください。

PTPアプリケーション内でのメッセージの同期受信

次の例は、WL_HOME\samples\server\examples\src\examples\jms\queueディレクトリ(WL_HOMEはWebLogic Platformのインストール先の最上位ディレクトリ)にあるWebLogic Server付属のexamples.jms.queue.QueueReceiveサンプルからの抜粋です。メッセージ・リスナーを設定するのではなく、各メッセージに対してqreceiver.receive()を呼び出します。例:

qreceiver = qsession.createReceiver(queue);
qreceiver.receive();

最初の行では、キューに対するキュー・レシーバが作成されます。2番目の行では、receive()メソッドが実行されます。receive()メソッドは、ブロックしてメッセージを待ちます。

Pub/Subアプリケーション内でのメッセージの同期受信

次の例は、WL_HOME\samples\server\examples\src\examples\jms\topicディレクトリ(WL_HOMEはWebLogic Platformのインストール先の最上位ディレクトリ)にあるWebLogic Server付属のexamples.jms.topic.TopicReceiveサンプルからの抜粋です。メッセージ・リスナーを設定するのではなく、各メッセージに対してtsubscriber.receive()を呼び出します。

例:

tsubscriber = tsession.createSubscriber(topic);
Message msg = tsubscriber.receive();
msg.acknowledge();

最初の行では、トピックに対するトピック・サブスクライバが作成されます。2番目の行では、receive()メソッドが実行されます。receive()メソッドは、ブロックしてメッセージを待ちます。

受信メッセージの回復


注意:

この節の説明は、確認応答モードがCLIENT_ACKNOWLEDGEに設定されている非トランザクション・セッションだけに適用されます。同期受信されるAUTO_ACKNOWLEDGEメッセージは確認応答済みのため、回復されないことがあります。


アプリケーションは、次のメソッドを使用して、JMSにメッセージの再配信(未確認)をリクエストできます。

public void recover(
) throws JMSException

recover()メソッドは、次の手順を実行します。

  • セッションのメッセージ配信を停止します。

  • 確認応答されていない(ただし配信されている可能性のある)すべてのメッセージに再配信のタグを付けます。

  • そのセッションの確認応答されていない最初のメッセージからメッセージの送信を再開します。


    注意:

    キュー内のメッセージは、必ずしも元の配信順序と同じ順序で、または同じキュー・コンシューマに再配信されるとは限りません。再配信メッセージの正しい配信順序の保証については、「メッセージの再配信の順序付け」を参照してください。


受信メッセージの確認応答


注意:

この節の説明は、確認応答モードがCLIENT_ACKNOWLEDGEに設定されている非トランザクション・セッションだけに適用されます。


受信したメッセージの確認応答を行うには、次のMessageメソッドを使用します。

public void acknowledge(
) throws JMSException

acknowledge()メソッドは、接続ファクトリの「確認応答ポリシー」属性の構成によって次のように異なります。

このメソッドは、確認応答モードがCLIENT_ACKNOWLEDGEに設定されている非トランザクション・セッションに対してだけ有効です。それ以外の場合、このメソッドは無視されます。

オブジェクト・リソースの解放

JMSアプリケーションにかわって作成した接続、セッション、メッセージ・プロデューサ/コンシューマ、接続コンシューマ、またはキュー・ブラウザを使い終えたら、それらを明示的にクローズしてリソースを解放する必要があります。

JMSオブジェクトをクローズするには、close()メソッドを次のとおり入力します。

public void close(
) throws JMSException

オブジェクトをクローズするときには、以下の処理が行われます。

各オブジェクトについてのclose()メソッドの影響については、該当するjavax.jmsのJavadoc (http://www.oracle.com/technetwork/java/jms/index.html)を参照してください。また、接続またはセッションのclose()メソッドの詳細は、それぞれ「接続の開始、停止、クローズ」「セッションのクローズ」を参照してください。

次の例は、WL_HOME\samples\server\examples\src\examples\jms\queueディレクトリ(WL_HOMEはWebLogic Platformのインストール先の最上位ディレクトリ)にあるWebLogic Server付属のexamples.jms.queue.QueueSendサンプルからの抜粋です。この例では、メッセージ・コンシューマ、セッション、および接続オブジェクトをクローズするのに必要なコードを示してあります。

public void close(
) throws JMSException
{
 qreceiver.close();
 qsession.close();
 qcon.close();
}

このQueueSendの例では、main()の最後にclose()メソッドが呼び出され、オブジェクトのクローズとリソースの解放が行われます。