プライマリ・コンテンツに移動
Oracle® Fusion Middleware Oracle WebLogic Server JMSアプリケーションの開発
12c (12.2.1.3.0)
E90332-02
目次へ移動
目次

前
次

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

JMS 2.0およびJMS 1.1 APIを使用して基本的なWebLogic JMSアプリケーションを設定する方法を説明します。

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

WebLogicアプリケーションのメッセージの作成、送信、受信および読取りのために必要なすべてのクラスとインタフェースを定義する、Javaパッケージをインポートします。

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

表6-1 WebLogic JMSパッケージ

パッケージ名 説明
javax.jms

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

javax.naming
weblogic.jndi 

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

javax.transaction.UserTransaction

JTAユーザー・トランザクション・サポートに必要なJTA API。http://www.oracle.com/technetwork/java/javaee/jta/index.htmlを参照してください。

weblogic.jms.extensions 

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

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

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

次の各項で、基本的なWebLogic JMSアプリケーションを設定する手順を説明します。

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

簡略化APIを使用したJMSアプリケーションの設定

Oracle WebLogic Server 12.2.1は、メッセージの送受信で、JMS 2.0簡略化APIをサポートします。簡略化APIの詳細は「簡略化APIプログラミング・モデルの理解」を参照してください。

図6-1は、JMS 2.0簡略化APIを使用してJMSアプリケーションを設定するのに必要な手順を示しています。

図6-1 簡略化APIを使用したJMSアプリケーションの設定

図6-1の説明が続きます
「図6-1 簡略化APIを使用したJMSアプリケーションの設定」の説明

JNDIでの接続ファクトリのルックアップ

接続ファクトリをルックアップするには、あらかじめ接続ファクトリを構成情報の一部として定義しておく必要があります。

管理者は構成時に新しい接続ファクトリを構成できますが、これらのファクトリには一意の名前を付ける必要があります。そうしないとサーバーが起動しません。Java EE仕様およびWebLogic Serverによって定義されたデフォルト接続ファクトリも使用できます。詳細は、Oracle WebLogic Server JMSリソースの管理の接続ファクトリ構成に関する項を参照してください。

接続ファクトリの定義後にそれをルックアップするには、InitialContext()コンストラクタ(http://docs.oracle.com/javase/7/docs/api/javax/naming/InitialContext.html#InitialContext())を使用してJNDIコンテキスト(namingContext)を確立します。サーブレット・アプリケーション以外のあらゆるアプリケーションでは、InitialContextコンストラクタをコールするときに、環境を定義するHashtableを提供する必要があります。

JNDIコンテキストが定義された場合、JNDIで接続ファクトリをルックアップするには、次のコマンドを実行します。

ConnectionFactory connectionFactory = 
 (ConnectionFactory) namingContext.lookup(CF_name);

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

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

キューまたはトピックのルックアップ

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

宛先の構成後に、次のいずれかの手順を実行してキューまたはトピックの宛先をルックアップできます。

JNDIコンテキスト(namingContext)を確立し(「JNDIで接続ファクトリをルックアップする」で実行済)、次のコマンド(ポイント・ツー・ポイントまたはパブリッシュ/サブスクライブ・メッセージング用)のいずれかを実行することによって、キューまたはトピック宛先をルックアップできます。

Queue queue = (Queue) namingContext.lookup(Queue_name); 

Topic topic = (Topic) namingContext.lookup(Topic_name); 

Queue_nameおよびTopic_name引数は、構成時に定義されたキューおよびトピック宛先のJNDI名を指定します。

JMSContextオブジェクトの作成

JMSContextオブジェクトは、クラシックAPIのConnectionおよびSessionオブジェクトを置き換えます。詳細は、「簡略化JMS APIの新しいインタフェース」を参照してください。

JMSContextオブジェクトは、ConnectionFactoryオブジェクト上で、いくつかのcreateContextメソッドのいずれかをコールすることによって作成できます。例:

JMSContext context = connectionFactory.createContext(sessionMode);

この場合、新しいJMSContextオブジェクトcontextが使用するために、指定されたモードでの接続およびセッションが作成されます。詳細は、http://docs.oracle.com/javaee/7/api/javax/jms/ConnectionFactory.htmlの、connectionFactoryインタフェース定義を参照してください。

別の方法として、「@Injectアノテーションを使用したJMSContextオブジェクトの宣言」で説明している@Injectアノテーションを使用して、Java EEのWebおよびEJBコンテナにJMSContextをインジェクトできます。これは、Java EEアプリケーションでJMSContextを作成する場合の推奨される方法です。例:

@Inject @JMSConnectionFactory("myJMSCF") JMSContext context;

JMSContextインタフェースの使用に関する詳細は、http://docs.oracle.com/javaee/7/api/javax/jms/JMSContext.htmlを参照してください。

JMSProducerおよびJMSConsumerオブジェクトの作成

メッセージを送信または受信するには、それぞれJMSProducerおよびJMSConsumerオブジェクトを使用します。

次のようにJMSContextオブジェクト上でcreateProducerメソッドをコールすることによって、JMSProducerオブジェクトを作成できます。

JMSProducer producer = context.createProducer();

注意:

JMSProducerオブジェクトを変数に保存する必要はありません。そのかわり、次のように、sendメソッドのコール時にオブジェクトを作成します。

context.createProducer().send(queue, message);

詳細は、http://docs.oracle.com/javaee/7/api/javax/jms/JMSProducer.htmlを参照してください。

次のようにして、JMSContextオブジェクト上でcreateConsumerメソッドの1つにQueueまたはTopicオブジェクトを渡すことによって、JMSConsumerオブジェクトを作成できます。

JMSContext context = connectionFactory.createContext();
JMSConsumer consumer = context.createConsumer(queue);

詳細は、http://docs.oracle.com/javaee/7/api/javax/jms/JMSConsumer.htmlを参照してください。

簡略化APIを使用したメッセージの送受信

次の項では、簡略化APIを使用してメッセージを送受信する方法を説明します。

クラシックAPIを使用したJMSアプリケーションの設定

次の図は、JMS 1.1クラシックAPIを使用してJMSアプリケーションを設定するのに必要な手順を示しています。

図6-2 クラシックAPIを使用したJMSアプリケーションの設定

図6-2の説明が続きます
「図6-2 クラシックAPIを使用したJMSアプリケーションの設定」の説明

注意:

Oracle WebLogic Server 12.2.1は、メッセージの送受信で、JMS 2.0簡略化APIをサポートします。「簡略化APIプログラミング・モデルの理解」を参照してください。

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

接続ファクトリをルックアップするには、あらかじめ接続ファクトリを構成情報の一部として定義しておく必要があります。

管理者は構成時に新しい接続ファクトリを構成できますが、これらのファクトリには一意の名前を付ける必要があります。そうしないとサーバーが起動しません。Java EE仕様およびWebLogic Serverによって定義されたデフォルト接続ファクトリも使用できます。詳細は、『Oracle WebLogic Server JMSリソースの管理』の接続ファクトリ構成に関する項を参照してください。

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

コンテキストの定義後に、JNDIで接続ファクトリをルックアップするには、PTPまたはパブリッシュ/サブスクライブ・メッセージングにそれぞれ次のコマンドのいずれかを実行します。

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

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

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

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

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

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

Connectionクラスの詳細は、「Connection」またはjavax.jms.ConnectionのJavadoc (http://docs.oracle.com/javaee/7/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://docs.oracle.com/javaee/7/api/javax/jms/QueueConnectionFactory.html)を参照してください。QueueConnectionクラスの詳細は、javax.jms.QueueConnectionのJavadoc (http://docs.oracle.com/javaee/7/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://docs.oracle.com/javaee/7/api/javax/jms/TopicConnectionFactory.html)を参照してください。TopicConnectionクラスの詳細は、javax.jms.TopicConnectionのJavadoc (http://docs.oracle.com/javaee/7/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://docs.oracle.com/javaee/7/api/javax/jms/Session.html)を参照してください。

createSessionメソッドを使用したセッションの作成

javax.jms.Connectionで、createSessionメソッドを使用して、セッションを作成します。このメソッドは、次のように、単一のパラメータsessionModeを受け入れるか、パラメータを使用しません。

Session createSession(int sessionMode) throws JMSException

or

Session createSession() throws JMSException
キュー・セッションの作成

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

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

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

QueueConnectionクラスのメソッドの詳細は、javax.jms.QueueConnectionのJavadoc (http://docs.oracle.com/javaee/7/api/javax/jms/QueueConnection.html)を参照してください。QueueSessionクラスの詳細は、javax.jms.QueueSessionのJavadoc (http://docs.oracle.com/javaee/7/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://docs.oracle.com/javaee/7/api/javax/jms/TopicConnection.html)を参照してください。TopicSessionクラスの詳細は、javax.jms.TopicSessionのJavadoc (http://docs.oracle.com/javaee/7/api/javax/jms/TopicSession.html)を参照してください。

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

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

宛先の構成後に、JNDI名または参照を使用して宛先をルックアップできます。

JNDI名の使用

JNDIコンテキスト(context)を確立し(「JNDIで接続ファクトリをルックアップする」で実行済)、次のコマンド(PTPまたはパブリッシュ/サブスクライブ・メッセージング用)のいずれかを実行することによって、宛先をルックアップできます。

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

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

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

参照の使用

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

注意:

createQueue()メソッドとcreateTopic()メソッドでは宛先が動的には作成されず、既存の宛先への参照のみが作成されます。宛先の動的な作成については、「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のJavadoc (http://docs.oracle.com/javaee/7/api/javax/jms/MessageProducer.html)およびjavax.jms.MessageConsumerのJavadoc (http://docs.oracle.com/javaee/7/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://docs.oracle.com/javaee/7/api/javax/jms/QueueSession.html)を参照してください。QueueSenderクラスとQueueReceiverクラスの詳細は、javax.jms.QueueSenderのJavadoc (http://docs.oracle.com/javaee/7/api/javax/jms/QueueSender.html)およびjavax.jms.QueueReceiverのJavadoc (http://docs.oracle.com/javaee/7/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://docs.oracle.com/javaee/7/api/javax/jms/TopicSession.html)を参照してください。TopicPublisherクラスとTopicSubscriberクラスの詳細は、javax.jms.TopicPublisherのJavadoc (http://docs.oracle.com/javaee/7/api/javax/jms/TopicPublisher.html)および javax.jms.TopicSubscriberのJavadoc (http://docs.oracle.com/javaee/7/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://docs.oracle.com/javaee/7/api/javax/jms/Session.html)およびweblogic.jms.extensions.WLSessionのJavadocを参照してください。Messageクラスとそのメソッドの詳細は、「Message」またはjavax.jms.MessageのJavadoc (http://docs.oracle.com/javaee/7/api/javax/jms/Message.html)を参照してください。

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

注意:

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

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

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

    注意:

    onMessage()メソッドのインタフェースの例については、「例: クラシックAPIを使用したポイント・ツー・ポイントJMSアプリケーションの設定」を参照してください

    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://docs.oracle.com/javaee/7/api/javax/jms/MessageConsumer.html)を参照してください。

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

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

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

例: クラシックAPIを使用したポイント・ツー・ポイントJMSアプリケーションの設定

次の例は、EXAMPLES_HOME\wlserver\samples\server\examples\src\examples\jms\classicapi\queueディレクトリにあるWebLogic Server付属のexamples.jms.queue.QueueSend例からの抜粋です。EXAMPLES_HOMEは、WebLogic Serverのサンプル・コードが構成されるディレクトリを表します。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)を参照してください。

例: クラシックAPIを使用したパブリッシュ/サブスクライブJMSアプリケーションの設定

次の例は、EXAMPLES_HOME\wlserver\samples\server\examples\src\examples\jms\classicapi\topicディレクトリにあるWebLogic Server付属のexamples.jms.topic.TopicSend例からの抜粋です。EXAMPLES_HOMEは、WebLogic Serverのサンプル・コードが構成されるディレクトリを表します。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()インタフェース(「例: クラシックAPIを使用したポイント・ツー・ポイントJMSアプリケーションの設定」を参照)と同じです。

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

メッセージの送信

メッセージを送信するには、簡略化APIまたはクラシックAPIのいずれかを使用します。

「JMSアプリケーションの設定」での説明に従ってJMSアプリケーションを設定した後、メッセージの送信を開始できます。

簡略化JMS APIを使用したメッセージの送信

簡略化APIでは、メッセージは、JMSContextの代役となるJMSProducerオブジェクトを作成することによって送信されます。詳細は、「JMSProducerおよびJMSConsumerオブジェクトの作成」を参照してください。

指定された宛先にメッセージを送信するには、クラシックAPIにおけるMessageProducersendメソッドに対比できる、次のJMSProducerメソッドを使用できます。

JMSProducer send(Destination destination, Message message)

例:

context.createProducer().send(destination,"Hello");

このコードは、TextMessageオブジェクトを作成し、その本文を「Hello」と設定し、続いてそれを、指定されたdestinationに送信します。

次のJMSProducerメソッドも使用できます。これは適切なメッセージ・タイプのメッセージを自動的に作成し、ペイロードを、指定されたパラメータに設定します。

JMSProducer send(Destination destination,byte[] body)

JMSProducer send(Destination destination, Map<String,Object> body)

JMSProducer send(Destination destination, Serializable body)

JMSProducer send(Destination destination, String body)

JMSProducerインタフェースおよびsendメソッドの詳細は、次の場所にあるJavadocを参照してください。

http://docs.oracle.com/javaee/7/api/javax/jms/JMSProducer.html

WebLogic JMSには、メッセージ送信時に使用できる独自の属性があります。weblogic.jms.extensions.WLJMSProducerJMSProducerインスタンスをキャストすることによって、配信モード(DeliveryMode.PERSISTENTまたはDeliveryMode.NON_PERSISTENT)、優先度(0-9)、配信遅延および存続時間(ミリ秒単位)を指定することもできます。Oracle WebLogic Server Java APIリファレンスにあるWLSJMSProducerのJavadocを参照してください。

例:

context.createProducer().setDeliveryMode(DeliveryMode.NON_PERSISTENT).send(destination,message);

指定しない場合、配信モード、優先度、および存続時間の各属性は以下のいずれかに設定されます。

クラシックJMS APIを使用したメッセージの送信

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

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

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

  3. MessageProducerを使用してメッセージを宛先に送信する

メッセージの送信に使用するJMSクラスとメッセージ・タイプの詳細は、javax.jms.MessageのJavadoc (http://docs.oracle.com/javaee/7/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://docs.oracle.com/javaee/7/api/javax/jms/Session.html)を参照してください。

MessageProducerを使用してメッセージを宛先に送信する

DestinationオブジェクトとMessageProducerオブジェクトは、「クラシックAPIを使用したJMSアプリケーションの設定」で説明したとおり、アプリケーションの設定時に作成されています

注意:

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

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

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

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

注意:

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

QueueSenderおよびTopicPublisherメソッドを使用したメッセージ送信の詳細は、次のWebLogic Serverドキュメントを参照してください。

https://docs.oracle.com/middleware/1213/wls/JMSPG/implement.htm#JMSPG228

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

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

メッセージの非同期送信

非同期モードでは、JMSクライアントは、メッセージを送信したら、JMSサーバーからの確認応答を待機せずに、アプリケーションに制御を戻します。

メッセージを非同期送信するには、アプリケーションでCompletionListenerオブジェクトを定義する必要があります。メッセージを受信したことを示す確認応答をJMSサーバーから受信すると、JMSプロバイダは、アプリケーションで定義されたCompletionListenerオブジェクト上のコールバック・メソッドonCompletionを呼び出して、アプリケーションに通知します。CompletionListenerインタフェースの詳細は、http://docs.oracle.com/javaee/7/api/javax/jms/CompletionListener.htmlを参照してください。

javax.jms.CompletionListenerオブジェクトを定義したら、次のようにして、JMSProducerまたはMessageProducerオブジェクトを使用してメッセージを非同期送信します。

  • JMSProducerオブジェクトを使用してメッセージを送信する場合、JMSProducerオブジェクト上で、NULLでないCompletionListenerを指定してメソッドsetAsync(CompletionListener listener)をコールしてから、sendメソッドをコールします(次の例を参照)。

    // send a message asynchronously
    try (JMSContext context = connectionFactory.createContext()) {
     MyCompletionListener myCompletionListener = new MyCompletionListener();
    //call normal send method
     context.createProducer().setAsync(myCompletionListener).send(queue, "Hello world");
     ...
    }
    

    詳細は、「簡略化JMS APIを使用したメッセージ送信」を参照してください。

  • MessageProducerを使用してメッセージを送信する場合は、次のメソッドを使用してメッセージを非同期送信します。

    messageProducer.send(message,completionListener);
    

    詳細は、「クラシックJMS APIを使用したメッセージ送信」を参照してください。

JMSProducerおよびMessageProducer属性の設定

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

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

注意:

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

表6-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 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://docs.oracle.com/javaee/7/api/javax/jms/MessageProducer.html)またはweblogic.jms.extensions.WLMessageProducerのJavadocを参照してください。

例: ポイント・ツー・ポイント・アプリケーション内でのメッセージの送信

次の例は、EXAMPLES_HOME\wl_server\examples\src\examples\jms\queueディレクトリにあるWebLogic Server付属のexamples.jms.queue.QueueSend例からの抜粋です。EXAMPLES_HOMEは、WebLogic Serverのサンプル・コードが構成されるディレクトリを表します。この例では、TextMessageを作成し、メッセージのテキストを設定してキューに送信するために必要なコードを示してあります。

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

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

例: パブリッシュ/サブスクライブ・アプリケーション内でのメッセージの送信

次の例は、EXAMPLES_HOME\wl_server\examples\src\examples\jms\topicディレクトリにあるWebLogic Server付属のexamples.jms.topic.TopicSend例からの抜粋です。EXAMPLES_HOMEは、WebLogic Serverのサンプル・コードが構成されるディレクトリを表します。この例では、TextMessageを作成し、メッセージのテキストを設定してトピックに送信するために必要なコードを示してあります。

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

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

メッセージの受信

JMSConsumerおよびMessageConsumerメソッドを使用してメッセージを受信する方法について説明します。

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

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

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

  • 構成時またはsend()メソッドの一部として定義するメッセージ配信属性(配信モードとソート条件)。詳細については、「メッセージの送信」を参照してください

  • 宛先キーを使用して設定される宛先ソート順序。詳細は、Oracle WebLogic Server管理コンソール・オンライン・ヘルプ宛先キーの構成に関する項を参照してください。

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

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

簡略化APIを使用したメッセージの非同期受信

てメッセージを受信するには、まず、JMSContextオブジェクト上で、いくつかのcreateConsumerまたはcreateDurableConsumerメソッドの1つを使用してJMSConsumerオブジェクトを作成する必要があります。

JMSConsumerオブジェクトを作成し、メソッドsetMessageListenerを使用して、MessageListenerインタフェースを実装するオブジェクトを指定します。メッセージ配信が自動的に開始されます。

JMSConsumer consumer = context.createConsumer(queue);
consumer.setMessageListener(messageListener);

クラシックAPIを使用したメッセージの非同期受信

クラシックAPIを使用したメッセージの非同期受信は、アプリケーションの設定コンテキスト内に記載されています。詳細は、「ステップ6b: 非同期メッセージ・リスナーを登録する(オプション)」を参照してください

注意:

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

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

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

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

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

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

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

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

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

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

    注意:

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

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

簡略化APIを使用したメッセージの同期受信

JMSConsumerオブジェクト上のreceiveメソッドは、メッセージの同期配信のために使用されます。

public String receiveMessage(
ConnectionFactory connectionFactory,Queue queue){
   String body=null;
   try (JMSContext context = connectionFactory.createContext();){
      JMSConsumer consumer = session.createConsumer(queue);
      body = consumer.receiveBody(String.class);
   } catch (JMSRuntimeException ex) {
      // handle exception
   }
   return body;
}

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

クラシックAPIを使用したメッセージの同期受信

メッセージを同期的に受信するには、以下の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://docs.oracle.com/javaee/7/api/javax/jms/MessageConsumer.html)を参照してください。

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

次の例は、EXAMPLES_HOME\wl_server\examples\src\examples\jms\queueディレクトリにあるWebLogic Server付属のexamples.jms.queue.QueueReceive例からの抜粋です。EXAMPLES_HOMEは、WebLogic Serverのサンプル・コードが構成されるディレクトリを表します。メッセージ・リスナーを設定するのではなく、各メッセージに対してqreceiver.receive()を呼び出します。例:

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

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

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

次の例は、EXAMPLES_HOME\wl_server\examples\src\examples\jms\topicディレクトリにあるWebLogic Server付属のexamples.jms.topic.TopicReceive例からの抜粋です。EXAMPLES_HOMEは、WebLogic Serverのサンプル・コードが構成されるディレクトリを表します。メッセージ・リスナーを設定するのではなく、各メッセージに対してtsubscriber.receive()を呼び出します。

例:

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

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

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

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

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

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

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

受信メッセージの回復

注意:

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

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

public void recover(
) throws JMSException

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

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

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

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

    注意:

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

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

受信したメッセージの確認応答を行うには、acknowledge()メソッドを使用します。このメソッドは、接続ファクトリの「確認応答ポリシー」属性の構成によって異なります。

注意:

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

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

public void acknowledge(
) throws JMSException

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

  • デフォルト・ポリシーの「All」の場合、あるメッセージの確認応答が呼び出されると、セッションで受信したすべての未確認応答メッセージに対して確認応答が行われます。

  • 「Previous」ポリシーの場合、あるメッセージの確認応答が呼び出されると、そのメッセージ以前の未確認応答メッセージだけに対して確認応答が行われます。確認応答が行われないメッセージは、クライアントに再配信できます。

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

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

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

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

public void close(
) throws JMSException

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

  • メソッド呼出しが完了して未処理の非同期レシーバのonMessage()メソッド呼出しが完了するまで、その呼出しがブロックされます。

  • 関連付けられているすべてのサブ・オブジェクトもクローズされます。たとえば、セッションをクローズすると、関連付けられているすべてのメッセージ・プロデューサおよびコンシューマもクローズされます。接続をクローズすると、関連付けられているすべてのセッションもクローズされます。

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

次の例は、EXAMPLES_HOME\wl_server\examples\src\examples\jms\queueディレクトリにあるWebLogic Server付属のexamples.jms.queue.QueueSend例からの抜粋です。EXAMPLES_HOMEは、WebLogic Serverのサンプル・コードが構成されているディレクトリを表します。この例では、メッセージ・コンシューマ、セッション、および接続オブジェクトをクローズするのに必要なコードを示してあります。

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

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