目次へ

2.JMSの基礎2

2006.10.12 株式会社四次元データ 宮澤了祐

2.1.JMSの構造

JMSは次の三種で成り立っています。

  • JMSサーバ
  • JMSクライアント
  • JMSメッセージ

JMSクライアントはメッセージを送受信するJavaプログラムのことで、JMSサーバはそれを仲介するプログラムです。 JMSクライアントが送信するメッセージはJMSメッセージと呼ばれています。

JMS自体は標準APIであり、Javaでメッセージングサービスを利用する際には、ActiveMQなどそのAPIを実装したJMSサーバが必要となります。

JMSには次のオブジェクトがあります。

  • ConnectionFactoryオブジェクト
     ConnectionFactoryオブジェクトを用いてJMSクライアントがJMSサーバとの間の接続を作成します。
  • Connectionオブジェクト
     JMSクライアントとJMSサーバとの間の接続を表します。  Messageオブジェクトを作成し、送受信するためのSessionオブジェクトを作成します。
  • Destinationオブジェクト
     宛先をカプセル化するオブジェクトです。  javax.jms.Queueとjavax.jms.Topicなどの実装クラスがあります。
  • Sessionオブジェクト
     Sessionオブジェクトはメッセージの生成、処理を行うオブジェクトです。  MessageProducerオブジェクト及びMessageConsumerオブジェクトを作成することが出来ます。
  • MessageProducerオブジェクト/MessageConsumerオブジェクト
     メッセージを送信するオブジェクトと、メッセージを受信するオブジェクトです。
  • Messageオブジェクト
     送信、または受信される情報をカプセル化するオブジェクトです。

2.2.JMSのメッセージモデル

メッセージングを行う場合、次の二種類の状況が存在します。一対一でメッセージをやりとりする状況と、一対多でメッセージをやり取りする場合です。これらをメッセージモデルといいます。

前者の送信側と受信側が一対一であるモデルを Point-to-Pointモデル。後者と送信側と受信側が一対多であるモデルをPublisher-Subscriber と呼びます。Publisher-Subscriberモデルについては次項で解説します。

二種類のメッセージモデルがありますが、利用者はメッセージモデルを意識することなくプログラミングを行うことが出来るように設計されています。

JMSのプログラムの流れは以下になります。

  1. ConnectionFactoryオブジェクトを作成
  2. ConnectionFactoryを用いてConnectionオブジェクトを作成
  3. ConnectionよりSessionオブジェクトを作成
  4. Sessionを用いてDestinationオブジェクトを作成
  5. Sessionを用いてDestinationに関連付けたMessageProducer/MessageConsumerを作成
  6. Sessionを用いてMessageオブジェクトを作成
  7. MessageProducerを用いてMessageを送信/MessageConsumerを用いてMessageを受信

具体的にはモデルによって実装するサブクラスが違うため、プログラムの流れには差がありません。

2.3.Point-to-Pointメッセージモデル

PTPメッセージモデルは送信者と受信者が一対一でメッセージをやりとりします。

PTPと言っても送信者側と受信者側を直接接続するわけではありません。 JMSサーバ内に作成するDestinationオブジェクトを介してメッセージのやり取りを行います。 送信者はJMSサーバに対してメッセージを送信します。JMSサーバはDestinationオブジェクトにメッセージを保存します。 受信者はJMSサーバ内のDestiationよりメッセージを取り出します。

前項で使用したソースを元に解説していきます。

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import org.activemq.ActiveMQConnectionFactory;
import org.activemq.ActiveMQConnection;

public class Sender {
	public static void main(String[] args){     
        try {
			//ConnectionFactoryオブジェクトの作成
			QueueConnectionFactory factory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_BROKER_URL);
			 
			//Connectionオブジェクトの作成
			QueueConnection connection = factory.createQueueConnection();
			    
			//Sessionオブジェクトの作成
			QueueSession session = connection.createQueueSession(false,QueueSession.AUTO_ACKNOWLEDGE);
			    
			//Destinationオブジェクトの作成
			Queue queue = session.createQueue("TestQueue");
			    
			//MessageProducerオブジェクトの作成
			QueueSender sender= session.createSender(queue);
			    
			//Messageオブジェクトの作成
			Message msg = session.createTextMessage("This is Message!!");
			sender.send(msg);
            
        	sender.close();
        	session.close();
        	connection.close();
        
     	} catch (JMSException e) {
        	e.printStackTrace();
    	}        
	}
}

まずConnectionFactoryを作成します。ActiveMQでConnectionFactoryを作成するにはいくつか方法がありますが、 最も簡単なインスタンスを作成する方法を使用しています。引数はMessageBrokerを認識するためのURLです。

次に、ConnectionFactoryよりConnectionオブジェクトを作成します。 PTPモデルでのメッセージングを行う場合は、ConnectionFactory#createQueueConnection()メソッドを使用してQueueConnectionオブジェクトを作成します。

続いて、アプリケーションとJMSサーバを接続するSessionオブジェクトを作成します。 Connection#createQueueSession()メソッドで作成します。 第一引数はトランザクション(JTA)を使用するかどうかのフラグです。第二引数で確認モードを設定します。トランザクションと確認モードについては後半で解説します。

QueueSession#createQueue()メソッドによりDestinationオブジェクトを作成します。 QueueオブジェクトはPTPメッセージモデルでのDestinationオブジェクトです。 引数はQueueオブジェクトの識別名です。

MessageProducerオブジェクトを作成します。PTPモデルで使用するMessageProducerはQueueSenderオブジェクトです。 関連付けるQueueオブジェクトを引数に持ちます。

QueueSession#createTextMessage()メソッドでテキストを送信するJMSメッセージオブジェクトを作成します。 QueueSender#send()メソッドで送信します。

続いて受信側です。

送信側も受信側も大して差はありません。送信側がMessageProducerオブジェクトを作成するのに対し、受信者側はMessageConsumerオブジェクトを作成します。

...
Queue queue = session.createQueue("TestQueue");
QueueReceiver receiver = session.createReceiver(queue);

TextMessage msg = (TextMessage) receiver.receive();
System.out.println(msg.getText());
...

PTPモデルでのMessageConsumerがQueueReceiverオブジェクトです。引数は関連付けるQueueオブジェクトです。

メッセージの受信はQueueReceiver#receive()メソッドを用います。 メッセージを受け取るまで待機します。

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp