Sun ONE ロゴ      前へ      目次      索引      次へ     
Sun ONE Message Queue 開発者ガイド



第 3 章   管理対象オブジェクトの使用


管理対象オブジェクトは、プロバイダ固有の実装および構成情報を JMS クライアントが使用するオブジェクト内にカプセル化します。

MQ は、コネクションファクトリと送信先という 2 種類の JMS 管理対象オブジェクトと、JAXM 管理対象オブジェクトを提供します。どちらの管理対象オブジェクトもプロバイダ固有の情報をカプセル化しますが、その用途は異なっています。ConnectionFactory オブジェクトと XAConnectionFactory (分散トランザクション) オブジェクトは MQ メッセージサーバへのコネクションの作成に使用されます。これに対して、Destination オブジェクト (物理的送信先を表す) は、JMS メッセージコンシューマと JMS メッセージプロデューサの作成に使用されます (「簡単なクライアントアプリケーションの開発」を参照)。

JAXM エンドポイント管理対象オブジェクトは、SOAP メッセージの送信に使用されます (第 5 章「SOAP メッセージの操作」を参照)。

管理対象オブジェクトの使用方法は、次の 2 通りです。

  • 管理者によって構成され、ネームサービスに格納されます。クライアントは、JNDI 検索コードを使ってこうした管理対象オブジェクトにアクセスし、プロバイダに依存しない方式でこれらを使用します。

  • クライアントコードの作成時、開発者によってインスタンス化され、設定されます。この場合、プロバイダ固有の方法で使用されます。

管理対象オブジェクトの使用方法は、アプリケーションの実行環境や、クライアントの MQ 固有の設定内容をどの程度まで制御するかによって決まります。この章では、この 2 通りの方法と、それぞれに対する JMS クライアントコードの作成方法を説明します。



管理対象オブジェクトの JNDI 検索



集中管理型のメッセージ環境の制御下でアプリケーションを実行する場合は、管理者が MQ 管理対象オブジェクトを作成し構成する必要があります。これにより、管理者は、次のことができるようになります。

  • クライアントに対して、JNDI 検索を使って事前構成済みの ConnectionFactory (および XAConnectionFactory) オブジェクトにアクセスするように要求することにより、コネクションの動作を制御する

  • クライアントに対して、既存の物理的送信先に対応する Destination オブジェクトだけにアクセスするように要求することにより、物理送信先の増加を抑制する

この方法によって、管理者はメッセージサーバとクライアントランタイムの構成内容を管理することが可能となり、同時に、クライアントはプロバイダに依存しない JMS コードを使えるようになります。このため、クライアントは、プロバイダ固有の構文およびオブジェクトの命名規則、またはプロバイダ固有の構成プロパティを把握する必要がなくなります。

管理者は、MQ 管理ツールを使って管理対象オブジェクトを作成します。詳細は、『MQ 管理者ガイド』を参照してください。管理者は、作成する管理対象オブジェクトを読み取り専用に指定できます。この場合、このオブジェクトの作成時に指定した MQ 固有の構成値をクライアント側で変更することができなくなります。つまり、クライアントコードでは、読み取り専用の管理対象オブジェクトに属性値を設定することはできません。また、クライアント起動オプションを使ってこれらをオーバーライドすることもできません。詳細は、「オーバーライド指定をしてクライアントアプリケーションを起動」を参照してください。

クライアント側で、クライアント自身の ConnectionFactory (および XAConnectionFactory) や送信先管理対象オブジェクトをインスタンス化することは可能ですが、その場合は、管理者が、アプリケーションが要求するブローカのリソースを制御し、アプリケーションのパフォーマンスを調整するという管理対象オブジェクトの本来の目的を果たせなくなります。また、管理対象オブジェクトをインスタンス化すると、クライアントアプリケーションはプロバイダ依存になります。


ConnectionFactory オブジェクトの検索


ConnectionFactory オブジェクトの JNDI 検索を行うには

  1. JNDI 検索の初期コンテキストを作成します。

    初期コンテキストの作成方法は、ファイルシステムストアを使用するか、MQ 管理対象オブジェクトの LDAP サーバを使用するかによって異なります。次に示すのは、ファイルシステムストアを使用する場合のコードです。対応する LDAP サーバプロパティについては、『MQ 管理者ガイド』を参照してください。

    Hashtable env = new Hashtable();
    env.put (Context.INITIAL_CONTEXT_FACTORY,
       "com.sun.jndi.fscontext.RefFSContextFactory");
    env.put (Context.PROVIDER_URL,
       "file:///c:/
    imq_admin_objects");
    Context ctx = new InitialContext(env);

    この例のように、プログラムを使用するのではなく、コマンド行からシステムプロパティを指定して環境設定を行うこともできます。具体的な手順については、サンプルアプリケーションディレクトリのサブディレクトリ jms 内の README ファイルを参照してください。

    IMQ_HOME/demo/jms (Solaris では /usr/demo/imq/jms)

    システムプロパティを使って環境設定を行う場合は、env パラメータを指定せずにコンテキストを初期化します。

    Context ctx = new InitialContext();

  2. ConnectionFactory オブジェクトや XAConnectionFactory オブジェクトが JNDI オブジェクトストアに格納された「検索」名を使って JNDI 検索を行います。

    QueueConnectionFactory myQConnFactory = (QueueConnectionFactory)
       ctx.lookup("cn=MyQueueConnectionFactory");

    このコネクションファクトリをオリジナルの構成として使用することをお勧めします。ConnectionFactory および XAConnectionFactory オブジェクト構成プロパティについては、「MQ クライアントランタイムの設定可能なプロパティ」を参照してください。全プロパティの一覧は、「ConnectionFactory 管理対象オブジェクト」のとおりです。

  3. ConnectionFactory を使って Connection オブジェクトを作成します。

    QueueConnection myQConn =
       myQConnFactory.createQueueConnection();

コード例 3-1 に、前の手順で使用したコードを示します。

コード例 3-1    ConnectionFactory オブジェクトの検索

Hashtable env = new Hashtable();
env.put (Context.INITIAL_CONTEXT_FACTORY,
    "com.sun.jndi.fscontext.RefFSContextFactory");

env.put (Context.PROVIDER_URL,
    "file:///c:/imq_admin_objects");

Context ctx = new InitialContext(env);
QueueConnectionFactory myQConnFactory = (QueueConnectionFactory)
    ctx.lookup("cn=MyQueueConnectionFactory");

QueueConnection myQConn =
    myQConnFactory.createQueueConnection();



Destination オブジェクトの検索


Destination オブジェクトの JNDI 検索を行うには

  1. ConnectionFactory の検索時と同じ初期コンテキストで、JNDI 検索を行います。JNDI 検索には、Destination オブジェクトが JNDI オブジェクトストアに格納された「検索」名を使用します。

    Queue myQ =
    (Queue) ctx.lookup("cn=MyQueueDestination");



管理対象オブジェクトのインスタンス化

アプリケーションを集中管理環境の制御下で実行する必要がない場合は、クライアントコード内の管理対象オブジェクトのインスタンス化および設定が可能です。

この方法では、開発者が、メッセージサーバとクライアントランタイムの設定情報を制御します。この場合、クライアントは、その他の JMS プロバイダではサポートされません。通常は、次のような場合にクライアントコード内の管理対象オブジェクトをインスタンス化します。

  • まだ開発の初期段階で、管理対象オブジェクトの作成、設定、格納の必要がない場合。この場合は、JNDI 検索を省略してアプリケーションの開発およびデバッグを行うことができます。

  • その他の JMS プロバイダでクライアントをサポートする必要がない場合。

クライアントコード内の管理対象オブジェクトをインスタンス化するということは、設定値をアプリケーションにハードコーディングするということです。この場合、アプリケーションの配置後に、管理者が管理対象オブジェクトを再構成してパフォーマンスやスループットを改善するという柔軟性は得られません。


ConnectionFactory オブジェクトのインスタンス化

MQ の ConnectionFactory 管理対象オブジェクトをインスタンス化するオブジェクトコンストラクタは、プログラミングドメインごとに 1 つずつ、合計で 2 個用意されています。

  • パブリッシュ/サブスクライブ (トピック) ドメイン

    new com.sun.messaging.TopicConnectionFactory();

    TopicConnectionFactory をデフォルト構成でインスタンス化します (ポート番号 7676 の「localhost」で実行されているブローカに対して Topic TCP ベースのコネクションを作成)。

  • ポイントツーポイント (キュー) ドメイン

    new com.sun.messaging.QueueConnectionFactory();

    QueueConnectionFactory をデフォルト設定でインスタンス化します (ポート番号 7676 の「localhost」で実行されているブローカに対してキュー TCP ベースのコネクションを作成)。


ConnectionFactory オブジェクトを直接インスタンス化し、設定するには

  1. 適切なコンストラクタを使って、Topic または Queue ConnectionFactory オブジェクトをインスタンス化します。

    com.sun.messaging.QueueConnectionFactory myQConnFactory =
       new com.sun.messaging.QueueConnectionFactory();

  2. ConnectionFactory オブジェクトを設定します。

    myQConnFactory.setProperty("imqBrokerHostName", "new_hostname");
    myQConnFactory.setProperty("imqBrokerHostPort", "7878");

    ConnectionFactory 設定プロパティについては、「MQ クライアントランタイムの設定可能なプロパティ」を参照してください。全プロパティの一覧は、「ConnectionFactory 管理対象オブジェクト」のとおりです。

  3. ConnectionFactory を使って Connection オブジェクトを作成します。

    QueueConnection myQConn =
       myQConnFactory.createQueueConnection();

コード例 3-2 に、前の手順で使用したコードを示します。

コード例 3-2    ConnectionFactory オブジェクトのインスタンス化

com.sun.messaging.QueueConnectionFactory myQConnFactory =
    new com.sun.messaging.QueueConnectionFactory();

try {
    myQConnFactory.setProperty("imqBrokerHostName", "new_host");
    myQConnFactory.setProperty("imqBrokerHostPort", "7878");
} catch (JMSException je) {
}
QueueConnection myQConn =
    myQConnFactory.createQueueConnection();



Destination オブジェクトのインスタンス化

MQ の Destination 管理対象オブジェクトをインスタンス化するオブジェクトコンストラクタは、プログラミングドメインごとに 1 つずつ、合計で 2 個用意されています。

  • パブリッシュ/サブスクライブ (トピック) ドメイン

    new com.sun.messaging.Topic();

    デフォルトの送信先名「Untitled_Destination_Object」で Topic をインスタンス化します。

  • ポイントツーポイント (キュー) ドメイン

    new com.sun.messaging.Queue();

    デフォルトの送信先名「Untitled_Destination_Object」で Queue をインスタンス化します。


Destination オブジェクトを直接インスタンス化し、設定するには

  1. 適切なコンストラクタを使って、Topic または Queue Destination オブジェクトをインスタンス化します。

    com.sun.messaging.Queue myQueue = new com.sun.messaging.Queue();

  2. Destination オブジェクトを設定します。

    myQueue.setProperty("imqDestinationName", "new_queue_name");

  3. セッションの作成後、Destination オブジェクトを使って MessageProducer または MessageConsumer オブジェクトを作成します。

    QueueSender qs = qSession.createSender((Queue)myQueue);

コード例 3-3 にコードを示します。

コード例 3-3    Destination オブジェクトのインスタンス化

com.sun.messaging.Queue myQueue = new com.sun.messaging.Queue();
try {
    myQueue.setProperty("imqDestinationName", "new_queue_name");
} catch (JMSException je) {
}
...
QueueSender qs = qSession.createSender((Queue)myQueue);
...



オーバーライド指定をしてクライアントアプリケーションを起動



Java アプリケーションだけでなく、メッセージングアプリケーションの起動時にも、コマンド行からシステムプロパティを指定できます。このメカニズムを利用して、クライアントコード内の MQ 管理対象オブジェクトの属性値をオーバーライドすることができます。クライアントコード内の setProperty() メソッドでインスタンス化および設定された MQ 管理対象オブジェクトだけでなく、JNDI 検索によってアクセスされる MQ 管理対象オブジェクトの構成もオーバーライドできます。

管理対象オブジェクトの設定をオーバーライドするには、次のコマンド行構文を使用します。

java [[-Dattribute=value ]...] clientAppName

attribute は、「MQ クライアントランタイムの設定可能なプロパティ」に記載されている任意の ConnectionFactory 管理対象オブジェクトの属性です。

たとえば、クライアントを、クライアントコード内でアクセスされる ConnectionFactory 管理対象オブジェクト内に指定されたブローカ以外のブローカに接続する場合は、そのブローカの imqBrokerHostNameimqBrokerHostPort が設定されるようにコマンド行で指定して、クライアントを起動します。

System.setProperty() メソッドを使って、クライアントコード内のシステムプロパティを設定することもできます。このメソッドは、コマンド行オプションと同じようにして、MQ 管理対象オブジェクトの属性値をオーバーライドします。

ただし、読み取り専用の管理対象オブジェクトの属性値は、コマンド行オプションでも System.setProperty() メソッドでも変更できません。オーバーライドの指定は無視されます。


前へ      目次      索引      次へ     
Copyright © 2002 Sun Microsystems, Inc. All rights reserved.

最終更新日 2002 年 6 月 19 日