A サーバー・セッション・プール(非推奨)
サーバー・セッション・プール(サーバー・セッションのサーバー管理プールを定義するための非推奨のJMS機能)を構成および使用する方法を学習します。この機能を使用すると、アプリケーションで複数のメッセージを並行して処理できます。WebLogic Serverの非推奨リリース。
サーバー・セッション・プールの定義
ノート:
セッション・プールは現在ほとんど使用されていません。理由は、Java EE仕様の必須の部分ではないこと、JTAユーザー・トランザクションをサポートしていないこと、そして大部分がメッセージドリブンBean (MDB)に取って代わられたことです。MDBの方が簡単で管理しやすく、高機能です。MDBの設計の詳細は、『Oracle WebLogic Server Enterprise JavaBeansバージョン2.1の開発』のメッセージドリブンEJBに関する項を参照してください。
WebLogic JMSには、サーバー・セッションのサーバー管理プールを定義するためのオプションのJMS機能が実装されています。この機能を使用すると、アプリケーションで複数のメッセージを並行して処理できます。
サーバー・セッション・プールの機能は次のとおりです。
-
宛先からメッセージを受信し、そのメッセージを、メッセージ処理用に用意したサーバー側のメッセージ・リスナーに渡します。メッセージ・リスナー・クラスには、メッセージを処理する
onMessage()
メソッドがあります。 -
JMSセッションのプールを管理することで、メッセージを並行して処理します。各セッションでは、シングル・スレッドの
onMessage()
メソッドが実行されます。
図A-1に、サーバー・セッション・プール機能、およびアプリケーションとアプリケーション・サーバーのコンポーネントの関係を示します。
図A-1に示されているように、アプリケーションにはシングル・スレッドのメッセージ・リスナーが用意されています。JMSによって実装された、アプリケーション・サーバー上の接続コンシューマによって、以下のタスクが実行され、1つまたは複数のメッセージが処理されます。
-
サーバー・セッション・プールからサーバー・セッションを取得します。
-
サーバー・セッションのセッションを取得します。
-
セッションに1つまたは複数のメッセージをロードします。
-
サーバー・セッションを開始して、メッセージを受信します。
-
メッセージの処理が終了したら、サーバー・セッションを解放してプールに戻します。
図A-2に、メッセージの並行処理を行うための準備に必要なステップを示します。
この手順では、アプリケーションで、他のアプリケーション・サーバー・プロバイダのセッション・プール実装を使用できます。サーバー・セッション・プールはメッセージドリブンBeanを使用して実装することもできます。サーバー・セッション・プールを実装するためのメッセージドリブンBeanの使用については、『Oracle WebLogic Server Enterprise JavaBeansバージョン2.1の開発』のメッセージドリブン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://docs.oracle.com/javase/6/docs/api/javax/naming/InitialContext.html#InitialContext()
)を使用してJNDIコンテキスト(context
)を確立します。サーブレット・アプリケーション以外のアプリケーションの場合は、初期コンテキストの作成に使用する環境を渡す必要があります。詳細は、NamingManager.InitialContext()
のJavadoc(http://docs.oracle.com/javase/6/docs/api/javax/naming/InitialContext.html#InitialContext()
)を参照してください。
コンテキストが定義されたら、次のコードを使用して、JNDIでサーバー・セッション・プール・ファクトリをルックアップします。
factory = (ServerSessionPoolFactory) context.lookup(<ssp_name>);
<ssp_name>
には、サーバー・セッション・プール・ファクトリの修飾名または非修飾名を指定します。
「ServerSessionPoolFactory」またはweblogic.jms.extensions.ServerSessionPoolFactory
のJavadocを参照してください。
ステップ2: サーバー・セッション・プール・ファクトリを使用してサーバー・セッション・プールを作成する
キュー(ポイント・ツー・ポイント)またはトピック(パブリッシュ/サブスクライブ)接続コンシューマで使用するサーバー・セッション・プールを作成するには、次の項で説明されているServerSessionPoolFactory
メソッドを使用できます。
サーバー・セッション・プールの詳細は、「ServerSessionPool」またはjavax.jms.ServerSessionPool
のJavadoc (http://docs.oracle.com/javaee/7/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://docs.oracle.com/javaee/7/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://docs.oracle.com/javaee/7/api/javax/jms/ConnectionConsumer.html
)を参照してください。
ステップ3: 接続コンシューマを作成する
以下の方法のいずれかを使用して、サーバー・セッションを取得し、メッセージを並行処理するための接続コンシューマを作成できます。
-
『Oracle WebLogic Server JMSリソースの管理』の基本JMSシステム・リソースの構成に関する項の説明に従って、構成時にサーバー・セッション・プールと接続コンシューマを構成します。
-
以降の節で説明されているConnectionメソッドをアプリケーションに含めます。
ConnectionConsumer
クラスの詳細は、「ConnectionConsumer」またはjavax.jms.ConnectionConsumer
のJavadoc (http://docs.oracle.com/javaee/7/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://docs.oracle.com/javaee/7/api/javax/jms/QueueConnection.html
)を参照してください。ConnectionConsumer
クラスの詳細は、javax.jms.ConnectionConsumer
のJavadoc (http://docs.oracle.com/javaee/7/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://docs.oracle.com/javaee/7/api/javax/jms/TopicConnection.html
)を参照してください。ConnectionConsumer
クラスの詳細は、javax.jms.ConnectionConsumer
のJavadoc (http://docs.oracle.com/javaee/7/api/javax/jms/ConnectionConsumer.html
)を参照してください。
例: PTPクライアントのサーバー・セッション・プールの設定
次の例では、JMSクライアント用のサーバー・セッション・プールを設定する方法を示します。startup()
メソッドは、「例: クラシックAPIを使用したポイント・ツー・ポイントJMSアプリケーションの設定」で説明されている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
)を参照してください。
例: ブリッシュ/サブスクライブ・クライアントのサーバー・セッション・プールの設定
次の例では、JMSクライアント用のサーバー・セッション・プールを設定する方法を示します。startup()
メソッドは、「例: クラシックAPIを使用したパブリッシュ/サブスクライブJMSアプリケーションの設定」で説明されている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
)を参照してください。