JavaでHello World
Google
  HOME  |  基礎  |  掲示板  |  ツール |  書籍  |  デザインパターン  |  リンク  |  フィードバック
JavaでHello World > JMS(Publisher/Subscriber)編  
メニュー
Home
情報交換掲示板
ツールの部屋
Java関連の書籍
アプリケーション編
Swing編
Swing(イベント)編
Swing(Look&Feel)編
アプレット編
iアプリ編
サーブレット編
サーブレット(Linux)編
サーブレット(web.xml)編
サーブレット(セッション)編
サーブレット(クッキー)編
サーブレット(フィルタ)編
JSP編
JSP(ディレクティブ)編
JSP(アクション)編
JSP(スクリプト)編
JSP(オブジェクト)編
JSP(カスタムタグ)編
JSP(データベース)編
Apache + Tomcat編
Struts編
JDBC編
JDBC(データソース)編
JDBC(MySQL)編
JDBC(PostgreSQL)編
JDBC(トランザクション)編
JavaMail(SMTP)編
JavaMail(POP)編
JNI編
RMI編
RMI(アプレット)編
CORBA編
JNDI編
EJB編
EJB(Entity Bean)編
JMS(PTP)編
JMS(Pub/Sub)編
XML(SAX)編
XML(DOM)編
XSLT編
SOAP編
国際化編
国際化(タイムゾーン)編
国際化(通貨)編
リフレクション編
コレクション編
コレクション(Set)編
コレクション(List)編
コレクション(Map)編
スレッド編
正規表現編
アサーション編
ログ機能編
サウンド編
ファイル入出力編
URL編
ソケット編
データグラム編
HTTP
FTP編
jar編
javadoc編
Ant編
外部コマンド編
プロパティファイル編
システムプロパティ編
Eclipse編
  2002/02/03  田中宏和
JMS(Publisher/Subscriber)編
◆JMSとは?
JMSJava Message Serviceの略です。メッセージを送ったり受け取ったりするためのAPIです。J2EEの一部の機能として提供されています。メッセージの送受信の方法にはPoint-to-PointPublish-Subscribeの2種類あります。ここではPublish-Subscribeを使用します。
◆Publish-Subscribe(Pub/Sub)とは?
送り側はトピックに対してメッセージを送信します。そのメッセージはそのトピックをサブスクライブ(購読)しているすべてのアプリケーションが受信できます。サブスクライブしているすべてのアプリケーションの受信が終わるとその時点でトピックからそのメッセージは削除されます。
◆ここでの環境
OS Windows 2000
J2SE SDK 1.3.1_01
J2EE SDK 1.3_01
◆環境変数
%JAVA_HOME% C:\jdk1.3.1_01
%J2EE_HOME% C:\j2sdkee1.3
%PATH% %JAVA_HOME%bin;%J2EE_HOME%\bin を含める
%CLASSPATH% .;%J2EE_HOME%\lib\j2ee.jar;%J2EE_HOME%\lib\locale を含める
◆Javaソースコード(メッセージの送り側/Publisher)
HelloWorldJmsPublisher.java(ここからダウンロード)
import javax.naming.*;
import javax.jms.*;

public class HelloWorldJmsPublisher {
  public final static String JMS_FACTORY="TopicConnectionFactory";
  public final static String TOPIC="MyTopic";

  public static void main(String[] args) {
    try {
      TopicConnectionFactory topicConnectionFactory;
      TopicConnection topicConnection;
      TopicSession topicSession;
      TopicPublisher topicPublisher;
      Topic topic;
      TextMessage msg;

      // JNDI InitialContextを作成します
      InitialContext ctx = new InitialContext();
      // Connection FactoryとTopicをLook upします
      topicConnectionFactory = (TopicConnectionFactory) ctx.lookup(JMS_FACTORY);
      topic = (Topic)ctx.lookup(TOPIC);
      // コネクションを作成
      topicConnection = topicConnectionFactory.createTopicConnection();
      // セッションを作成
      topicSession = topicConnection.createTopicSession(false,Session.AUTO_ACKNOWLEDGE);
      // トピックパブリッシャーを作成
      topicPublisher = topicSession.createPublisher(topic);
      // メッセージを作成
      msg = topicSession.createTextMessage();
      msg.setText("Hell World");
      // メッセージを送信
      topicPublisher.publish(msg);
      // 接続を閉じます
      topicPublisher.close();
      topicSession.close();
      topicConnection.close();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}
 
 
◆Javaソースコード(メッセージの受け取り側/Subscriber)
HelloWorldJmsSubscriber.java(ここからダウンロード)
import javax.naming.*;
import javax.jms.*;

public class HelloWorldJmsSubscriber {
  public final static String JMS_FACTORY="TopicConnectionFactory";
  public final static String TOPIC="MyTopic";

  public static void main(String[] args) {
    try {
      TopicConnectionFactory topicConnectionFactory;
      TopicConnection topicConnection;
      TopicSession topicSession;
      TopicSubscriber topicSubscriber;
      Topic topic;
      TextMessage msg;

      // JNDI InitialContextを作成します
      InitialContext ctx = new InitialContext();
      // Connection FactoryとTopicをLook upします
      topicConnectionFactory = (TopicConnectionFactory)ctx.lookup(JMS_FACTORY);
      topic = (Topic)ctx.lookup(TOPIC);
      // コネクションを作成
      topicConnection = topicConnectionFactory.createTopicConnection();
      // セッションを作成
      topicSession = topicConnection.createTopicSession(false,Session.AUTO_ACKNOWLEDGE);
      // トピックサブスクライバを作成
      topicSubscriber = topicSession.createSubscriber(topic);
      // メッセージの配送をスタート
      topicConnection.start();
      // メッセージの受信
      msg = (TextMessage) topicSubscriber.receive();
      System.out.println(msg.getText());
      // 接続を閉じます
      topicSubscriber.close();
      topicSession.close();
      topicConnection.close();
    } catch ( Exception e ) {
      e.printStackTrace();
    }
  }
}
 
 
◆コンパイル
コマンドプロンプト
C:\作業フォルダ\JavaHello>javac HelloWorldJmsPublisher.java HelloWorldJmsSubscriber.java

C:\作業フォルダ\JavaHello>

◆J2EEサーバーの起動(JMSプロバイダーの起動)
JMSプロバイダーはJ2EEサーバーの一部の機能として起動します。J2EEサーバーの起動はj2ee -verboseというコマンドでできます。
コマンドプロンプト
C:\作業フォルダ\JavaHello>j2ee -verbose
・・・・・・・・・・
・・・・・・・・・・
Starting web service at port: 8000
Starting secure web service at port: 7000
J2EE SDK/1.3
Starting web service at port: 9191
J2EE SDK/1.3
J2EE server startup complete.
◆トピックの作成
次に使用するトピックを作成します。j2eeadminコマンドで作成できます。
コマンドプロンプト
C:\作業フォルダ\JavaHello>j2eeadmin -addJmsDestination MyTopic topic
C:\作業フォルダ\JavaHello>
◆メッセージの送信
HelloWorldJmsPublisherを起動してメッセージをトピックに対して送信してみましょう!
コマンドプロンプト
C:\作業フォルダ\JavaHello>java HelloWorldJmsPublisher
Java(TM) Message Service 1.0.2 Reference Implementation (build b14)

C:\作業フォルダ\JavaHello>

◆メッセージの受信
新たな窓でコマンドプロンプト(MS-DOSプロンプト)を起動して、HelloWorldJmsSubscriberを動かしてみましょう!どうなるでしょうか?
コマンドプロンプト
C:\作業フォルダ\JavaHello>java HelloWorldJmsSubscriber
Java(TM) Message Service 1.0.2 Reference Implementation (build b14)

 

カーソルが点滅しているだけです。Pub/Subの場合はサブスクライブしてないとメッセージを受信できないからです。これでサブスクライブしている状態になったのでもう一度メッセージをトピックに送ってみましょう。
◆もう一度メッセージの送信
コマンドプロンプト
C:\作業フォルダ\JavaHello>java HelloWorldJmsPublisher
Java(TM) Message Service 1.0.2 Reference Implementation (build b14)

C:\作業フォルダ\JavaHello>

送れました。さて、HelloWorldJmsSubscriberを動かしている窓を見てみましょう!おおおおお!
コマンドプロンプト
C:\作業フォルダ\JavaHello>java HelloWorldJmsSubscriber
Java(TM) Message Service 1.0.2 Reference Implementation (build b14)
Hell World

C:\作業フォルダ\JavaHello>

おおおお!メッセージが着ているぞ!!なお、複数の窓でHelloWorldJmsSubscriberを動かした状態でメッセージをトピックに送るとすべてのHelloWorldJmsSubscriberにメッセージが届きます。これでPub/Subの動きがだいたいわかると思います。おおおお!
 
■関連
JMS(Point-to-Point)編
■書籍
Java関連の書籍
EJB関連の書籍

 
  ネットで買えば断然お得!お買い物なら楽天市場
ツールの部屋 - Java関連の書籍 - デザインパターン - 情報交換掲示板 - HOME