注意:
セッション・プールは現在ほとんど使用されていません。理由は、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
)を参照してください。
サーバー・セッション・プール・ファクトリを使用して、サーバー・セッション・プールを作成します。
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を参照してください。
キュー(ポイント・ツー・ポイント)またはトピック(パブリッシュ/サブスクライブ)接続コンシューマで使用するサーバー・セッション・プールを作成するには、次の項で説明されている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
)を参照してください。
以下の方法のいずれかを使用して、サーバー・セッションを取得し、メッセージを並行処理するための接続コンシューマを作成できます。
『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
)を参照してください。
次の例では、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();
JNDIでサーバー・セッション・プール・ファクトリをルックアップします。
sessionPoolFactory = (ServerSessionPoolFactory) ctx.lookup(SESSION_POOL_FACTORY);
次のように、サーバー・セッション・プール・ファクトリを使用してサーバー・セッション・プールを作成します。
sessionPool = sessionPoolFactory.getServerSessionPool(qcon, 5, false, Session.AUTO_ACKNOWLEDGE, examples.jms.startup.MsgListener);
このコードは、次を定義します:
qcon
は、サーバー・セッション・プールに関連付けられるキュー接続を示します
5
は、接続コンシューマ(ステップ3で作成予定)で取得できる並行セッションの最大数を示します。
false
は、セッションをトランザクション処理しないことを示します。
AUTO_ACKNOWLEDGE
は、確認応答モードを示します
examples.jms.startup.MsgListener
は、インスタンス化され、メッセージの受信および並行処理に使用されるメッセージ・リスナーを示します。
接続コンシューマを次のように作成します:
このコードは、次を定義します:
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();
JNDIでサーバー・セッション・プール・ファクトリをルックアップします。
sessionPoolFactory = (ServerSessionPoolFactory) ctx.lookup(SESSION_POOL_FACTORY);
次のように、サーバー・セッション・プール・ファクトリを使用してサーバー・セッション・プールを作成します。
sessionPool = sessionPoolFactory.getServerSessionPool(tcon, 5, false, Session.AUTO_ACKNOWLEDGE, examples.jms.startup.MsgListener);
このコードは、次を定義します:
tcon
は、サーバー・セッション・プールに関連付けられるトピック接続を示します。
5
は、接続コンシューマ(ステップ3で作成予定)で取得できる並行セッションの最大数を示します。
false
は、セッションをトランザクション処理しないことを示します。
AUTO_ACKNOWLEDGE
は、確認応答モードを示します。
examples.jms.startup.MsgListener
は、インスタンス化され、メッセージの受信および並行処理に使用されるメッセージ・リスナーを示します。
接続コンシューマを次のように作成します:
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
)を参照してください。