ヘッダーをスキップ
Oracle® Fusion Middleware Oracle WebLogic Server JMSのプログラミング
11gリリース1 (10.3.6)
B61629-04
  ドキュメント・ライブラリへ移動
ライブラリ
製品リストへ移動
製品
目次へ移動
目次

前
 
次
 

A 非推奨となったWebLogic JMS機能

この章では、サーバー・セッションのサーバー管理プールを定義するための非推奨のJMS機能であるサーバー・セッション・プールを構成して使用する方法について説明します。この機能を使用すると、アプリケーションで複数のメッセージを並行して処理できます。WebLogic Serverの非推奨のリリース

サーバー・セッション・プールの定義


注意:

セッション・プールは現在ほとんど使用されていません。理由は、Java EE仕様の必須の部分ではないこと、JTAユーザー・トランザクションをサポートしていないこと、そして大部分がメッセージドリブンBean (MDB)に取って代わられたことです。MDBの方が簡単で管理しやすく、高機能です。MDBの設計の詳細は、『Oracle WebLogic Server Enterprise JavaBeansのプログラミング』の「メッセージドリブンEJB」を参照してください。

WebLogic JMSには、サーバー・セッションのサーバー管理プールを定義するためのオプションのJMS機能が実装されています。この機能を使用すると、アプリケーションで複数のメッセージを並行して処理できます。

サーバー・セッション・プールの機能は次のとおりです。

次の図に、サーバー・セッション・プール機能、およびアプリケーションとアプリケーション・サーバーのコンポーネントの関係を示します。

図A-1 サーバー・セッション・プール機能

図A-1の説明が続きます
「図A-1 サーバー・セッション・プール機能」の説明

図に示されているように、アプリケーションにはシングル・スレッドのメッセージ・リスナーが用意されています。JMSによって実装された、アプリケーション・サーバー上の接続コンシューマによって、以下のタスクが実行され、1つまたは複数のメッセージが処理されます。

  1. サーバー・セッション・プールからサーバー・セッションを取得します。

  2. サーバー・セッションのセッションを取得します。

  3. セッションに1つまたは複数のメッセージをロードします。

  4. サーバー・セッションを開始して、メッセージを受信します。

  5. メッセージの処理が終了したら、サーバー・セッションを解放してプールに戻します。

次の図に、メッセージの並行処理を行うための準備に必要な手順を示します。

図A-2 メッセージの並行処理を行うための準備

図A-2の説明が続きます
「図A-2 メッセージの並行処理を行うための準備」の説明

この手順では、アプリケーションで、他のアプリケーション・サーバー・プロバイダのセッション・プール実装を使用できます。サーバー・セッション・プールはメッセージドリブンBeanを使用して実装することもできます。メッセージドリブンBeanによるサーバー・セッション・プールの実装の詳細は、『Oracle WebLogic Server Enterprise JavaBeansのプログラミング』の「メッセージドリブンEJB」を参照してください。

構成時にセッション・プールと接続コンシューマが定義された場合は、この手順を省略することができます。サーバー・セッション・プールおよび接続コンシューマの構成については、『Oracle WebLogic Server JMSの構成と管理』の「基本JMSシステム・リソースの構成」を参照してください。

WebLogic JMSは現在、オプションのTopicConnection.createDurableConnectionConsumer()処理をサポートしていません。このJMSの高度な処理の詳細については、JMS仕様(http://www.oracle.com/technetwork/java/jms/index.html)を参照してください。

ステップ1: JNDIでサーバー・セッション・プール・ファクトリをルックアップする

サーバー・セッション・プール・ファクトリを使用して、サーバー・セッション・プールを作成します。

WebLogic JMSでは、デフォルトで次のようなServerSessionPoolFactoryオブジェクトが定義されています。weblogic.jms.extensions.ServerSessionPoolFactory:<name>。ここで<name>には、セッション・プールの作成先になるJMSサーバーの名前を指定します。

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

コンテキストが定義されたら、次のコードを使用して、JNDIでサーバー・セッション・プール・ファクトリをルックアップします。

factory = (ServerSessionPoolFactory) context.lookup(<ssp_name>);

<ssp_name>には、サーバー・セッション・プール・ファクトリの修飾名または非修飾名を指定します。

サーバー・セッション・プール・ファクトリの詳細は、「ServerSessionPoolFactory」またはweblogic.jms.extensions.ServerSessionPoolFactoryのJavadocを参照してください。

ステップ2: サーバー・セッション・プール・ファクトリを使用してサーバー・セッション・プールを作成する

以降の節で説明するServerSessionPoolFactoryメソッドを使用して、キュー(PTP)またはトピック(Pub/Sub)の接続コンシューマで使用するサーバー・セッション・プールを作成できます。

サーバー・セッション・プールの詳細は、「ServerSessionPool」またはjavax.jms.ServerSessionPoolのJavadoc (http://download.oracle.com/javaee/5/api/javax/jms/ServerSessionPool.html)を参照してください。

キュー接続コンシューマで使用するサーバー・セッション・プールを作成する

ServerSessionPoolFactoryには、キュー接続コンシューマ用のサーバー・セッション・プールを作成する、次のメソッドが用意されています。

public ServerSessionPool getServerSessionPool(
 QueueConnection connection, 
 int maxSessions,
 boolean transacted, 
 int ackMode, 
 String listenerClassName
) throws JMSException

サーバー・セッション・プールに関連付けられるキュー接続、接続コンシューマ(ステップ3で作成予定)で取得できる並行セッションの最大数、セッションをトランザクション処理するかどうか、確認応答モード(トランザクション処理されないセッションの場合にのみ適用可能)、およびインスタンス化されメッセージの受信および並行処理に使用されるメッセージ・リスナー・クラスを指定する必要があります。

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

トピック接続コンシューマで使用するサーバー・セッション・プールを作成する

ServerSessionPoolFactoryには、トピック接続コンシューマ用のサーバー・セッション・プールを作成する、次のメソッドが用意されています。

public ServerSessionPool getServerSessionPool(
 TopicConnection connection, 
 int maxSessions,
 boolean transacted, 
 int ackMode, 
 String listenerClassName
) throws JMSException

サーバー・セッション・プールに関連付けられるトピック接続、接続コンシューマ(ステップ3で作成予定)で取得できる並行セッションの最大数、セッションをトランザクション処理するかどうか、確認応答モード(トランザクション処理されないセッションの場合にのみ適用可能)、およびインスタンス化され、メッセージの受信および並行処理に使用されるメッセージ・リスナー・クラスを指定する必要があります。

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

ステップ3: 接続コンシューマを作成する

以下の方法のいずれかを使用して、サーバー・セッションを取得し、メッセージを並行処理するための接続コンシューマを作成できます。

  • 『Oracle WebLogic Server JMSの構成と管理』の「基本JMSシステム・リソースの構成」の説明に従って、構成時にサーバー・セッション・プールと接続コンシューマを構成します。

  • 以降の節で説明されているConnectionメソッドをアプリケーションに含めます。

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

キュー用の接続コンシューマを作成する

QueueConnectionには、キュー用の接続コンシューマを作成する、次のメソッドが用意されています。

public ConnectionConsumer createConnectionConsumer(
 Queue queue,
 String messageSelector, 
 ServerSessionPool sessionPool,
 int maxMessages
) throws JMSException

関連付けられるキューの名前、メッセージをフィルタ処理するためのメッセージ・セレクタ、サーバー・セッションにアクセスするためのサーバー・セッション・プール、およびサーバー・セッションに同時に割り当てることができるメッセージの最大数を指定する必要があります。メッセージ・セレクタの詳細は、「メッセージのフィルタ処理」を参照してください。

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

トピック用の接続コンシューマを作成する

TopicConnectionには、トピック用のConnectionConsumersを作成する、以下の2種類のメソッドが用意されています。

public ConnectionConsumer createConnectionConsumer(
 Topic topic, 
 String messageSelector, 
 ServerSessionPool sessionPool,
 int maxMessages
) throws JMSException

public ConnectionConsumer createDurableConnectionConsumer(
 Topic topic, 
 String messageSelector,
 ServerSessionPool sessionPool, 
 int maxMessages
) throws JMSException

各メソッドには、関連付けられるトピックの名前、メッセージをフィルタ処理するためのメッセージ・セレクタ、サーバー・セッションにアクセスするためのサーバー・セッション・プール、およびサーバー・セッションに同時に割り当てることができるメッセージの最大数を指定する必要があります。メッセージ・セレクタの詳細は、「メッセージのフィルタ処理」を参照してください。

いずれのメソッドも接続コンシューマを作成しますが、後者のメソッドは、恒久サブスクライバで使用する恒久接続コンシューマも作成します。恒久サブスクライバの詳細は、「恒久サブスクリプションの設定」を参照してください。

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

例: PTPクライアントのサーバー・セッション・プールの設定

次の例では、JMSクライアント用のサーバー・セッション・プールを設定する方法を示します。startup()メソッドは、「例: PTPアプリケーションの設定」で説明されているexamples.jms.queue.QueueSendサンプルのinit()メソッドとほぼ同じです。このメソッドでもサーバー・セッション・プールを設定できます。

次の例にstartup()メソッドを示し、あわせて各設定の手順も説明します。

サーバー・セッション・プール・アプリケーションを実装するには、次のパッケージをインポート・リストに追加します。

セッション・プールの作成に必要なセッション・プール・ファクトリの静的変数を定義します。

private final static String SESSION_POOL_FACTORY=
       "weblogic.jms.extensions.ServerSessionPoolFactory:examplesJMSServer";

private QueueConnectionFactory qconFactory;
private QueueConnection qcon;
private QueueSession qsession;
private QueueSender qsender;
private Queue queue;
private ServerSessionPoolFactory sessionPoolFactory;
private ServerSessionPool sessionPool;
private ConnectionConsumer consumer;

必要なJMSオブジェクトを作成します。

public String startup(
 String name, 
 Hashtable args
) throws Exception

{
 String connectionFactory = (String)args.get("connectionFactory");
 String queueName = (String)args.get("queue");
 if (connectionFactory == null || queueName == null) {
        throw new  IllegalArgumentException("connectionFactory="+connectionFactory+
                     ", queueName="+queueName);
  }
 Context ctx = new InitialContext();
 qconFactory = (QueueConnectionFactory) 
       ctx.lookup(connectionFactory);
 qcon =qconFactory.createQueueConnection();
 qsession = qcon.createQueueSession(false, 
       Session.AUTO_ACKNOWLEDGE);
 queue = (Queue) ctx.lookup(queueName); 
 qcon.start();

ステップ1

JNDIでサーバー・セッション・プール・ファクトリをルックアップします。

 sessionPoolFactory = (ServerSessionPoolFactory) 
                 ctx.lookup(SESSION_POOL_FACTORY);

ステップ2

次のように、サーバー・セッション・プール・ファクトリを使用してサーバー・セッション・プールを作成します。

 sessionPool = sessionPoolFactory.getServerSessionPool(qcon, 5,
         false, Session.AUTO_ACKNOWLEDGE,
         examples.jms.startup.MsgListener); 

このコードでは、以下のように定義されています。

  • qconは、サーバー・セッション・プールに関連付けられるキュー接続を示します。

  • 5は、接続コンシューマ(ステップ3で作成予定)で取得できる並行セッションの最大数を示します。

  • falseは、セッションをトランザクション処理しないことを示します。

  • AUTO_ACKNOWLEDGEは、確認応答モードを示します。

  • examples.jms.startup.MsgListenerは、インスタンス化され、メッセージの受信および並行処理に使用されるメッセージ・リスナーを示します。

ステップ3

接続コンシューマを次のように作成します:

このコードでは、次が定義されています:

 consumer = qcon.createConnectionConsumer(queue, "TRUE",
       sessionPool, 10);
  • queueは、関連付けられるキューを示します。

  • TRUEは、メッセージをフィルタ処理するためのメッセージ・セレクタを示します。

  • sessionPoolは、サーバー・セッションにアクセスするためのサーバー・セッション・プールを示します。

  • 10は、サーバー・セッションに同時に割り当てることができるメッセージの最大数を示します。

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

例: Pub/Subクライアントのサーバー・セッション・プールの設定

次の例では、JMSクライアント用のサーバー・セッション・プールを設定する方法を示します。startup()メソッドは、「例: Pub/Subアプリケーションの設定」で説明されているexamples.jms.topic.TopicSendサンプルのinit()メソッドとほぼ同じです。このメソッドでもサーバー・セッション・プールを設定できます。

次の例にstartup()メソッドを示し、あわせて各設定手順も述べます。

サーバー・セッション・プール・アプリケーションを実装するには、次のパッケージをインポート・リストに追加します。

import weblogic.jms.extensions.ServerSessionPoolFactory

セッション・プールの作成に必要なセッション・プール・ファクトリの静的変数を定義します。

private final static String SESSION_POOL_FACTORY=
       "weblogic.jms.extensions.ServerSessionPoolFactory:examplesJMSServer";

private TopicConnectionFactory tconFactory;
private TopicConnection tcon;
private TopicSession tsession;
private TopicSender tsender;
private Topic topic;
private ServerSessionPoolFactory sessionPoolFactory;
private ServerSessionPool sessionPool;
private ConnectionConsumer consumer;

必要なJMSオブジェクトを作成します。

public String startup(
 String name, 
 Hashtable args
) throws Exception

{
 String connectionFactory = (String)args.get("connectionFactory");
 String topicName = (String)args.get("topic");
 if (connectionFactory == null || topicName == null) {
        throw new  IllegalArgumentException("connectionFactory="+connectionFactory+
                     ", topicName="+topicName);
  }
 Context ctx = new InitialContext();
 tconFactory = (TopicConnectionFactory) 
       ctx.lookup(connectionFactory);
 tcon = tconFactory.createTopicConnection();
 tsession = tcon.createTopicSession(false, 
       Session.AUTO_ACKNOWLEDGE);
 topic = (Topic) ctx.lookup(topicName); 
 tcon.start();

ステップ1

JNDIでサーバー・セッション・プール・ファクトリをルックアップします。

 sessionPoolFactory = (ServerSessionPoolFactory) 
                 ctx.lookup(SESSION_POOL_FACTORY);

ステップ2

次のように、サーバー・セッション・プール・ファクトリを使用してサーバー・セッション・プールを作成します。

 sessionPool = sessionPoolFactory.getServerSessionPool(tcon, 5,
         false, Session.AUTO_ACKNOWLEDGE,
         examples.jms.startup.MsgListener); 

このコードでは、以下のように定義されています。

  • tconは、サーバー・セッション・プールに関連付けられるトピック接続を示します。

  • 5は、接続コンシューマ(ステップ3で作成予定)で取得できる並行セッションの最大数を示します。

  • falseは、セッションをトランザクション処理しないことを示します。

  • AUTO_ACKNOWLEDGEは、確認応答モードを示します。

  • examples.jms.startup.MsgListenerは、インスタンス化され、メッセージの受信および並行処理に使用されるメッセージ・リスナーを示します。

ステップ3

次のように、接続コンシューマを作成します。

 consumer = tcon.createConnectionConsumer(topic, "TRUE",
       sessionPool, 10);

このコードでは、以下のように定義されています。

  • topicは、関連付けられるトピックを示します。

  • TRUEは、メッセージをフィルタ処理するためのメッセージ・セレクタを示します。

  • sessionPoolは、サーバー・セッションにアクセスするためのサーバー・セッション・プールを示します。

  • 10は、サーバー・セッションに同時に割り当てることができるメッセージの最大数を示します。

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