目次へ

1.JMSの基礎

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

1.1. JMSとは

JMSとはJava Message Serviceの略で、Javaでメッセージングサービスを利用するための標準APIです。 メッセージングとはプログラム間でデータを細かにわけるのではなく、一つのメッセージオブジェクトを作成して通信を行うことです。 常に接続が維持されている必要はなく、非同期に通信を行うことが出来ます。 実装されたメッセージングサービスはいくつかありますが、ここではオープンソースで開発された ActiveMQを使用します。 ActiveMQのインストールとサーバの起動については後述します。

メッセージングの概念を理解するために、宅配便に例えて解説を行います。

あなたは、ある宛先に対して送りたい物(オブジェクト)あったとします。 送るためには封筒やダンボールを用いて梱包を行う必要があります。 梱包された荷物(メッセージオブジェクト)に宛先を記入し、 数ある運送業者(中継サーバ)の中から一つを選択して荷物の配達をお願いします。 送り主がするべきことはこれで終わりますが、現在の荷物の状況を確かめることなどが運送業者によって可能になっていることもあります。

運送業者は書かれた宛先に対して荷物を配達します。もしその宛先が留守であれば(接続されていないならば)いったん持ち帰り、荷物を保存しておきます。 受け取り主が運送業者に対して配信を申し込んだ場合や、指定した時間が立った後、運送業者は再配信を行います。 受け取り主は届いた荷物から中身を取り出すことで、送信された物(オブジェクト)を受け取ることが出来ます。

これがメッセージングの一連の流れです。JMSではこのような一対一での通信以外にも複数の宛先に対してメッセージを送ることも出来るようになっています。

1.2. ActiveMQのインストールと起動

まずこちら(http://www.activemq.org/site/download.html)よりActiveMQをダウンロードし、適当な場所に展開します。 執筆時に使用したバージョンは3.2.2です。

解凍したフォルダの中にあるlibフォルダ以下の次のファイルをクラスパスに追加します。

  • commons-logging-1.0.3.jar
  • concurrent-1.3.4.jar
  • geronimo-spec-j2ee-management.jar
  • geronimo-spec-jms-1.1-rc4.jar
  • geronimo-spec-jta-1.0.1B-rc4.jar
  • geronimo-spec-j2ee-jacc-1.0-rc4.jar
  • activeio-1.1.jar
  • activemq-core-3.2.2.jar

ActiveMQサーバ/MessageBrokerの起動

ActiveMQでは中継を行うサーバのことをMessageBrokerと呼んでいます。 JMSを使用するためにはサーバを起動しておく必要があります。

起動するためにはいくつか方法があります。

  • バッチファイルを実行する。
     ActiveMQを解凍したフォルダの中にある「bin」フォルダの中の「activemq.bat(.sh)」というバッチファイルを起動することでMessageBrokerが立ち上がります。
  • org.activemq.broker.impl.Mainクラスを実行する
     実行することでMessageBrokerを立ち上げることが出来ます。
  • 埋め込みサーバを使用する
     コネクションを作成するConnectionFactoryオブジェクトにサーバを埋め込み起動することが出来ます。詳しくは別の章で解説します。

最も簡単なバッチファイルを用いた実行方法を例に解説します。

コマンドラインより
/bin/activemq.bat
を実行します。設定ファイルなどの読み込みなどが行われた後「INFO ActiveMQ JMS Message Broker (ID:******************) has started」などと出力されれば起動成功です。

1.3.簡単なメッセージ送受信のサンプル

メッセージを送信するプログラムを作成します。

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 {
        	//Connectionを作成するFactoryを作成
            QueueConnectionFactory factory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_BROKER_URL);
            QueueConnection connection = factory.createQueueConnection();
            
            //セッションの作成
            QueueSession session = connection.createQueueSession(false,QueueSession.AUTO_ACKNOWLEDGE);
            Queue queue = session.createQueue("TestQueue");
            QueueSender sender= session.createSender(queue);
            
            connection.start();
            
            Message msg = session.createTextMessage("This is Message!!");
            
            //メッセージの送信
            sender.send(msg);
            
            sender.close();
            session.close();
            connection.close();
        
        } catch (JMSException e) {
            e.printStackTrace();
        }
        
    }
}
続いて受信側です。
import javax.jms.JMSException;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueReceiver;
import javax.jms.QueueSession;
import javax.jms.TextMessage;

import org.activemq.ActiveMQConnection;
import org.activemq.ActiveMQConnectionFactory;

public class Receiver{

    public static void main(String[] args) {
        try{
            //Connectionを作成するFactoryを作成
            ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_BROKER_URL);
            QueueConnection connection = factory.createQueueConnection();
            
            //セッションの作成
            QueueSession session = connection.createQueueSession(false,QueueSession.AUTO_ACKNOWLEDGE);
            Queue queue = session.createQueue("TestQueue");
            
            //Queueと関連付け
            QueueReceiver receiver = session.createReceiver(queue);
            
            connection.start();

			//メッセージの受信
            TextMessage msg = (TextMessage) receiver.receive();
            System.out.println(msg.getText());
            
            receiver.close();
            session.close();
            connection.close();
        }catch(JMSException e){
            e.printStackTrace();
        }
    
    }
}

Reciever側に次のように出力されれば成功です。

This is Message!!

実行する前に必ずMessageBrokerを起動しておく必要があります。

 

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp