1 分散キューの例

この例では、2つのブローカに分散されるJMSキューとの通信方法を示します。クラスタ化されたキューは、着信メッセージがすべての接続キュー受信者にラウンドロビン方式で配信されるという点で、通常のキューと似ています。メッセージは、クラスタのキュー間では自動的には転送されません。

複製されたトピックの例に示されているように、クライアントでは、複数のJMSサーバ接続に設定された接続ファクトリを使用する必要があります。 これらを参照するには、JNDIを使用するか、またはNovell exteNd Messaging PlatformのAPIを使用してクラスタ対応接続ファクトリを作成し、JMQServerInfoデータ構造を使用してクラスタ情報を設定します。

送信者アプリケーションでは、クラスタリングを利用するために必要な設定はほとんどありません。 JMSは、サーバに障害が発生した場合、送信者をクラスタで使用できる任意のサーバに自動的および透過的に再接続します。キューは特定のブローカにバインドされるため、送信者アプリケーションは、キュー名の一部としてブローカの名前を指定します。

トピックサブスクライバの場合と同様、キュー受信者は、特定のJMSサーバに対してメッセージの確認を送信する必要があります。 キュー受信者は、アプリケーション固有の方法でキューの障害を処理する必要があるため、JMSでは、コンシューマアプリケーションに対する接続時の障害対策のみがサポートされています。しかし、キュー受信者は、任意の使用可能なブローカを使用してキューに接続できます。

特定のブローカにキューを接続する場合、次の文字列が使用されます。

queueName@brokerName

このセクションの例は、例を実行することで動作が説明されるため、前のポイントツーポイントの例と同じです。メッセージをクラスタの2つのサーバに送信する通常のキュー送信者トピック発行者のソースコードは、次のとおりです。キュー名は、コマンドラインから指定します。

package distQueue;
                                                                           
import javax.naming.InitialContext;
                                                                           
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.QueueSender;
import javax.jms.DeliveryMode;
import javax.jms.QueueSession;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
                                                                           
public class Sender
{
    public static void main(String[] args) throws Exception
    {
    |   // get the initial context
    |   InitialContext ctx = new InitialContext();
    |                                                                      
    |   // lookup the queue object
    |   Queue queue = (Queue) ctx.lookup("queue://" + args[0]);
    |                                                                      
    |   // lookup the queue connection factory
    |   QueueConnectionFactory connFactory = (QueueConnectionFactory) ctx.
    |       lookup("queue/connectionFactory");
    |                                                                      
    |   // create a queue connection
    |   QueueConnection queueConn = connFactory.createQueueConnection();
    |                                                                      
    |   // create a queue session
    |   QueueSession queueSession = queueConn.createQueueSession(false,
    |       Session.DUPS_OK_ACKNOWLEDGE);
    |                                                                      
    |   // create a queue sender
    |   QueueSender queueSender = queueSession.createSender(queue);
    |   queueSender.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
    |                                                                      
    |   // create a simple message to say "Hello"
    |   TextMessage message = queueSession.createTextMessage();
    |   message.setText(new java.util.Date().toString());
    |                                                                      
    |   // send the message
    |   queueSender.send(message);
    |                                                                      
    |   // print what we did
    |   System.out.println("sent: " + message.getText());
    |                                                                      
    |   // close the queue connection
    |   queueConn.close();
    }
}
Senderクラスが示すように、JNDIルックアップ文字列には、フェールオーバを実行できるようにホストとポートのペアが2つあります。 またクライアントアプリケーションは、ANTビルドスクリプトで説明されているように、ORBDefaultInitRefのクラスタ情報を使用して開始する必要があります。

Receiverクラスは、同じJNDIルックアップ文字列を使用して、接続時のフェールオーバを確実にします。ここでも、受信元のキュー名がコマンドラインオプションとして使用されます。

package distQueue;
                                                                           
import javax.naming.InitialContext;
                                                                           
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.QueueSession;
import javax.jms.QueueReceiver;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
                                                                           
public class Receiver
{
    public static void main(String[] args) throws Exception
    {
    |   // get the initial context
    |   InitialContext ctx = new InitialContext();
    |                                                                      
    |   // lookup the queue object
    |   Queue queue = (Queue) ctx.lookup("queue://" + args[0]);
    |                                                                      
    |   // lookup the queue connection factory
    |   QueueConnectionFactory connFactory = (QueueConnectionFactory) ctx.
    |       lookup("queue/connectionFactory");
    |                                                                      
    |   // create a queue connection
    |   QueueConnection queueConn = connFactory.createQueueConnection();
    |                                                                      
    |   // create a queue session
    |   QueueSession queueSession = queueConn.createQueueSession(false,
    |       Session.AUTO_ACKNOWLEDGE);
    |                                                                      
    |   // create a queue receiver
    |   QueueReceiver queueReceiver = queueSession.createReceiver(queue);
    |                                                                      
    |   // start the connection
    |   queueConn.start();
    |                                                                      
    |   // receive a message
    |   TextMessage message = (TextMessage) queueReceiver.receive();
    |                                                                      
    |   // print the message
    |   System.out.println("received: " + message.getText());
    |                                                                      
    |   // close the queue connection
    |   queueConn.close();
    }
}
それぞれB1B2という名前の2つのブローカが、ポート3506と3507のクラスタのローカルホストで実行しているとします。以下の表は、2つのサーバの稼働状態を変えて、異なるキューに対してメッセージを送信または受信するとどのようになるかをまとめたものです。送信者および受信者は、フラグORBDefaultInitRef=iioploc://localhost:3506,localhost:3507で実行していることを前提としています。

コマンド B1 B2 説明
Sender queue0
稼動中
稼動中
メッセージは、B1(送信者の接続先ブローカ)のqueue0に送信されます。これは、非クラスタ化環境での通常の動作です。
Receiver queue0
稼動中
稼動中
メッセージは、B1(受信者の接続先ブローカ)のqueue0から受信されます。これも、非クラスタ化環境での通常の動作です。
Sender queue0
稼動中
停止中
メッセージは、B1のqueue0に送信されます。B2が停止していても、送信者には影響ありません。
Receiver queue0
稼動中
停止中
メッセージは、B1のqueue0から受信されます。
Sender queue0
停止中
稼動中
メッセージは、B2のqueue0に送信されます。デフォルト(ローカル)ブローカは、ブローカ名がキュー名の一部として指定されていない場合に必ず使用されるので、メッセージはB1送信されません
Receiver queue0
停止中
稼動中
メッセージは、B2のqueue0から受信されます。
Sender queue0@B1
停止中
稼動中
メッセージは、B2を介してB1のqueue0に送信されます。B2は、再起動時にメッセージをB1に送ります。メッセージは、B2のqueue0から受信できません。
Receiver queue0@B1
稼動中
稼動中
メッセージは、B2を介してB1のqueue0から受信されます。B2は、実質的に、クライアントアプリケーションの代わりにプロキシ受信者を設定します。

キューセマンティックはブローカが1つだけの環境の場合と同じであるため、とても使いやすいです。クラスタであるため、メッセージは特定のブローカのキューと送受信されますが、これは、メッセージはクラスタの他の(使用可能な)ブローカを経由しても送受信できます。

トップに戻る


Copyright © 2000-2003, Novell, Inc.All rights reserved.