Java Message Service
Java Message Service (JMS) とはJavaプログラムにネットワークを介してデータを送受信させるためのAPIである。
Java EE 1.3プラットフォームに標準で含まれている。データを1つずつバラバラに扱うのではなく、メッセージと呼ばれる塊にまとめて送信する、メッセージング機能が使えるようになる。また、一対一の同期通信の他、複数の宛先に同じメッセージを送信したり、メッセージを非同期に通信したりすることもできる。
メッセージングの一般的な概念
メッセージングとは、疎結合分散通信形式のひとつの形式である。この文脈上での"通信"とはソフトウェアコンポーネント間のメッセージ交換である。
メッセージ指向技術は、キューのような仲介役のコンポーネントの導入によって密結合通信(TCPネットワークソケット、CORBA、 RMIのような)を緩和する。このアプローチによって、ソフトウェアコンポーネントがお互いに"間接的に"通信するようになる。この利益は、キューを使用して通信する場合に、メッセージ送信者が正確に受信者を知る必要がないということも含んでいる。
モデル
JMS API は二つのモデルをサポートする。
- 1対1:ポイント・ツー・ポイント(キューイングモデル)
- 1対多:出版-購読型モデル
ポイント・ツー・ポイント
ポイント・ツー・ポイントにおいて、送信者は特定のキューへメッセージを送信し受信者はそのキューからメッセージを読み込む。 ここで送信者は、メッセージの宛先を知っていて、受信者のキューに対して直接メッセージを送信している。これは、次のことを特色づける。
- ただ一人だけの消費者がメッセージを取得できる。
- 生産者は、消費者がメッセージを消費するときに、稼働していなくてもよい。また、消費者もメッセージが送信されたときに稼働していなくてもよい。
出版-購読型モデル
出版-購読型モデルでは、特定のメッセージトピックに対してメッセージを出版することができる。購読者は、受信対象のメッセージトピックに対して購読要求を行う。このモデルでは、出版者と購読者がお互いに知ることがない。比喩として掲示板が挙げられる。
このモデルの特徴を以下に挙げる。
- 複数の購読者が、メッセージを取得できる。
- 出版者と購読者は同時に稼働しないといけない。
出版者は、クライアントが購読可能になるためにサブスクリプションを生成しなくてはいけない。購読者は、持続的なサブスクリプションが確立されている間、継続的に受信し続ける。
コネクション確立
JMSは、アプリケーションをデータの転送レイヤから切り離す方法を提供する。 同じくJavaクラスは、プロバイダを要求するJNDIを使用することによって、異なるJMSプロバイダを通信を行うために利用することができる。 始めに、キューかトピックに接続するためにconnection factoryを使用し、そしてメッセージを送信、もしくは出版する。 受信者側では、メッセージを受信、もしくは購読する。
利用例
コネクション確立
コネクション確立は以下のようにして行う。最初の1行目は、Apache ActiveMQ の場合であり、実装によって異なる。
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
Connection connection = connectionFactory.createConnection();
// ここでメッセージの受信のリスナーの登録を行う
connection.start();
// ここでメッセージの送信を行う
connection.close();
出版-購読型モデル
出版-購読型モデルは以下のようにして行う。以下、送信側の例。
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Topic testTopic = session.createTopic("testTopic");
MessageProducer producer = session.createProducer(testTopic);
producer.send(session.createTextMessage("Hello JMS"));
以下、受信側の例。
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Topic testTopic = session.createTopic("testTopic");
MessageConsumer consumer = session.createConsumer(testTopic);
consumer.setMessageListener(new MessageListener() {
public void onMessage(Message message) {
try {
System.out.println(((TextMessage) message).getText());
} catch (JMSException e) {
}
}
});
実装
以下のソフトウェアで実装されている。
- Apache ActiveMQ
- Apache Qpid, using AMQP
- EMS from TIBCO
- OpenJMS, from The OpenJMS Group
- JBoss Messaging and HornetQ from JBoss
- JORAM, from the OW2 Consortium
- Open Message Queue, from Sun Microsystems
- BEA Weblogic (part of the Fusion Middleware suite) and Oracle AQ from Oracle
- RabbitMQ, using AMQP
- Solace JMS from Solace Systems
- SonicMQ from Progress Software
- StormMQ, using AMQP
- SwiftMQ
- WebSphere Application Server from IBM
- WebSphere MQ (formerly MQSeries) from IBM
- Ultra Messaging from 29 West (acquired by Informatica)
歴史
- 2001年6月25日 - 1.0.2b リリース
- 2002年3月18日 - 1.1 リリース