←フエルチラシノウラ。トップページへもどる。

【Java】OpenJMSを使った通信のサンプル。【JMS】

Java JMS 疎結合 MQ MOM messaging メッセージングサービス 非同期通信

フリーなJMS実装であるOpenJMSを使った非同期通信のサンプルです。

OpenJMSのインストール。


この辺からダウンロードします。
http://openjms.sourceforge.net/downloads.html
ダウンロードしたら任意の場所に解凍します。
解凍したフォルダの中にある lib/*.jar にパスを通しておきます。

OpenJMSの起動。


設定ファイルは config/openjms.xml ですが、今回は何も考えずにデフォルトで起動してみます。
bin フォルダの中の admin.bat を実行します。

上記コマンドで管理画面が立ち上がります。
管理画面のメニューからサービスを起動することができます。

デフォルトで topic1, queue1, queue2, queue3 というTOPICとQUEUEが用意されていると思います。
今回はこれらのデフォルトのTOPICまたはQUEUEを利用してみます。


PTP通信のサンプル。


Queueを利用した 1:1 の通信のサンプルです。
SenderがQueueへメッセージを送信するクラスで、ReceiverがQueueからのメッセージ配信を待ち受けるクラスです。

Sender.java
import java.util.Hashtable;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

public class Sender {
public static void main(String[] args) throws Throwable {
Hashtable properties = new Hashtable();
properties.put(Context.INITIAL_CONTEXT_FACTORY,
"org.exolab.jms.jndi.InitialContextFactory");
properties.put(Context.PROVIDER_URL, "rmi://localhost:1099/");
// Context の取得
Context context = new InitialContext(properties);
// PTP 用コネクションファクトリの取得
QueueConnectionFactory factory = (QueueConnectionFactory) context
.lookup("JmsQueueConnectionFactory");
QueueConnection conn = factory.createQueueConnection();
conn.start();
// セッションの作成
QueueSession session = conn.createQueueSession(false,
Session.AUTO_ACKNOWLEDGE);
// キューの取得
Queue queue = (Queue) context.lookup("queue1");
// メッセージの送信
QueueSender sender = session.createSender(queue);
TextMessage message = session.createTextMessage("HelloWorld");
sender.send(message);
// 終了処理
conn.stop();
session.close();
conn.close();
}
}

Receiver.java
import java.util.Hashtable;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueReceiver;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

public class Receiver {

public static void main(String[] args) throws Throwable {
Hashtable properties = new Hashtable();
properties.put(Context.INITIAL_CONTEXT_FACTORY,
"org.exolab.jms.jndi.InitialContextFactory");
properties.put(Context.PROVIDER_URL, "rmi://localhost:1099/");
// Context の取得
Context context = new InitialContext(properties);
// PTP 用コネクションファクトリの取得
QueueConnectionFactory factory = (QueueConnectionFactory) context
.lookup("JmsQueueConnectionFactory");
QueueConnection conn = factory.createQueueConnection();
conn.start();
// セッションの作成
QueueSession session = conn.createQueueSession(false,
Session.AUTO_ACKNOWLEDGE);
// キューの取得
Queue queue = (Queue) context.lookup("queue1");
// メッセージの受信
QueueReceiver receiver = session.createReceiver(queue);
TextMessage message = (TextMessage) receiver.receive();
System.out.println("Received message: " + message.getText());
// 終了処理
conn.stop();
session.close();
conn.close();
}
}


実行結果。


Sender.javaを起動してメッセージをQUEUEへ送信した後に、Receiver.javaを起動してみましょう。
以下のような結果が出力されます。

Received message: HelloWorld




Pub/Sub通信のサンプル。


Topicを利用した 1:n の通信のサンプルです。
PublisherがTopicへメッセージを送信するクラスで、SubscriberがTopicからのメッセージ配信を待ち受けるクラスです。

Publisher.java
import java.util.Hashtable;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;
import javax.jms.TopicConnection;
import javax.jms.TopicConnectionFactory;
import javax.jms.TopicPublisher;
import javax.jms.TopicSession;
import javax.naming.Context;
import javax.naming.InitialContext;

public class Publisher {

public static void main(String[] args) throws Throwable {
Hashtable properties = new Hashtable();
properties.put(Context.INITIAL_CONTEXT_FACTORY,
"org.exolab.jms.jndi.InitialContextFactory");
properties.put(Context.PROVIDER_URL, "rmi://localhost:1099/");
// Context の取得
Context context = new InitialContext(properties);
// Pub/Sub 用コネクションファクトリの取得
TopicConnectionFactory factory = (TopicConnectionFactory) context
.lookup("JmsTopicConnectionFactory");
TopicConnection conn = factory.createTopicConnection();
conn.start();
// セッションの作成
TopicSession session = conn.createTopicSession(false,
Session.AUTO_ACKNOWLEDGE);
// トピックの取得
Topic topic = (Topic) context.lookup("topic1");
// メッセージの送信
TopicPublisher publisher = session.createPublisher(topic);
TextMessage message = session.createTextMessage("hoge.");
publisher.publish(message);
// 終了処理
conn.stop();
session.close();
conn.close();
}

}

Subscriber.java
import java.util.Hashtable;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;
import javax.jms.TopicConnection;
import javax.jms.TopicConnectionFactory;
import javax.jms.TopicSession;
import javax.jms.TopicSubscriber;
import javax.naming.Context;
import javax.naming.InitialContext;

public class Subscriber {

public static void main(String[] args) throws Throwable {
Hashtable properties = new Hashtable();
properties.put(Context.INITIAL_CONTEXT_FACTORY,
"org.exolab.jms.jndi.InitialContextFactory");
properties.put(Context.PROVIDER_URL, "rmi://localhost:1099/");
// Context の取得
Context context = new InitialContext(properties);
// Pub/Sub 用コネクションファクトリの取得
TopicConnectionFactory factory = (TopicConnectionFactory) context
.lookup("JmsTopicConnectionFactory");
TopicConnection conn = factory.createTopicConnection();
conn.start();
// セッションの作成
TopicSession session = conn.createTopicSession(false,
Session.AUTO_ACKNOWLEDGE);
// トピックの取得
Topic topic = (Topic) context.lookup("topic1");
// メッセージの受信
TopicSubscriber subscriber = session.createSubscriber(topic);
TextMessage message = (TextMessage) subscriber.receive();
System.out.println("Received message: " + message.getText());
// 終了処理
conn.stop();
session.close();
conn.close();
}

}


実行結果。


Subscriber.javaを起動した後に、PublisherでメッセージをTopicへ送信してみましょう。
Subscriber.javaが以下のようなメッセージを出力します。

Received message: hoge.




MessageListener を実装したサブスクライバを使う場合。


MessageListenerを実装してSubscriberを作る場合のサンプルです。
TOPICに値が格納される度に onMessage メソッドが呼び出されます。
Publisherは先ほどと同じものを利用します。

Subscriber.java
import java.util.Hashtable;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;
import javax.jms.TopicConnection;
import javax.jms.TopicConnectionFactory;
import javax.jms.TopicSession;
import javax.jms.TopicSubscriber;
import javax.naming.Context;
import javax.naming.InitialContext;

public class Subscriber implements MessageListener {

public static void main(String[] args) throws Throwable {
new Subscriber();
}

public Subscriber() throws Throwable {
Hashtable properties = new Hashtable();
properties.put(Context.INITIAL_CONTEXT_FACTORY,
"org.exolab.jms.jndi.InitialContextFactory");
properties.put(Context.PROVIDER_URL, "rmi://localhost:1099/");
// Context の取得
Context context = new InitialContext(properties);
// Pub/Sub 用コネクションファクトリの取得
TopicConnectionFactory factory = (TopicConnectionFactory) context
.lookup("JmsTopicConnectionFactory");
TopicConnection conn = factory.createTopicConnection();
conn.start();
// セッションの作成
TopicSession session = conn.createTopicSession(false,
Session.AUTO_ACKNOWLEDGE);
// トピックの取得
Topic topic = (Topic) context.lookup("topic1");
// サブスクライバの生成
TopicSubscriber subscriber = session.createSubscriber(topic);
// サブスクライバにMessageListenerの実装である自分自身を登録
subscriber.setMessageListener(this);
}

/**
* リスンしているTOPICに値が格納されたときに呼び出されます。
*/
public void onMessage(Message arg0) {
System.out.println("onMessage: " + arg0);
}

}


実行結果。


Subscriber.javaを起動した後に、PublisherでメッセージをTopicへ送信してみましょう。
Subscriber.javaが以下のようなメッセージを出力します。

onMessage: hoge.




http://goodjob.boy.jp/chirashinoura/id/139.html

作成日: 2007-05-08 14:53:40

最終更新日: 2007-05-09 15:08:08

▲このページの上へ