JMS (Java Message Service) は、メッセージを作成、送信、読み取りする機能を提供する API です。疎結合で信頼性の高い非同期通信を提供します。
Javaの文字列結合
JMS はメッセージング サービスとしても知られています。
メッセージングを理解する
メッセージングは、アプリケーションまたはソフトウェア コンポーネントを通信するための技術です。
JMS は主に、あるアプリケーションから別のアプリケーションへメッセージを送受信するために使用されます。
JMSの要件
通常、ユーザーはアプリケーションにメッセージを送信します。ただし、あるアプリケーションから別のアプリケーションにメッセージを送信したい場合は、JMS API を使用する必要があります。
あるアプリケーション A がインドで実行され、別のアプリケーション B が米国で実行されているというシナリオを考えてみましょう。 A アプリケーションから B にメッセージを送信するには、JMS を使用する必要があります。
JMSのメリット
1) 非同期: メッセージを受信するために、クライアントはリクエストを送信する必要はありません。メッセージは自動的にクライアントに届きます。
2) 信頼性のある: これにより、メッセージが配信されることが保証されます。
メッセージングドメイン
JMS には 2 種類のメッセージング ドメインがあります。
- ポイントツーポイントメッセージングドメイン
- パブリッシャー/サブスクライバーのメッセージング ドメイン
1) ポイントツーポイント (PTP) メッセージング ドメイン
PTP モデルでは、1 つのメッセージは次のとおりです。 1人の受信者に配信される のみ。ここ、 列 メッセージ指向ミドルウェア (MOM) として使用されます。
キューは、受信者の準備ができるまでメッセージを保持する責任があります。
PTPモデルには、 タイミング依存性なし 送り手と受け手の間。
2) パブリッシャー/サブスクライバー (Pub/Sub) メッセージング ドメイン
Pub/Sub モデルでは、1 つのメッセージは次のとおりです。 購読者全員に配信されました 。放送のようなものです。ここ、 トピック メッセージの保持と配信を担当するメッセージ指向のミドルウェアとして使用されます。
PTPモデルには、 タイミング依存性 パブリッシャーとサブスクライバーの間で。
JMSプログラミングモデル
JMSキューの例
JMS キューのサンプルを開発するには、アプリケーション サーバーをインストールする必要があります。ここで使用しているのは、 グラスフィッシュ3 2 つの JNDI を作成しているサーバー。
- という名前の接続ファクトリを作成します myQueueConnectionFactory
- という名前の宛先リソースを作成します マイキュー
JNDIを作成したら、サーバーと受信側アプリケーションを作成します。サーバーと受信機を別のコンソールで実行する必要があります。ここでは Eclipse IDE を使用しています。デフォルトでは別のコンソールで開かれます。
1) 接続ファクトリーと宛先リソースを作成する
URLでサーバー管理コンソールを開きます。 http://ローカルホスト:4848
ユーザー名とパスワードを使用してログインします。
クリックしてください JMSリソース -> 接続ファクトリー -> 新規 、次に、プール名を書き込み、リソース タイプとして QueueConnectionFactory を選択し、[OK] ボタンをクリックします。
クリックしてください JMSリソース -> 宛先リソース -> 新規 で、JNDI 名と物理宛先名を入力し、[OK] ボタンをクリックします。
2) 送信側アプリケーションと受信側アプリケーションを作成する
送信者と受信者のコードを見てみましょう。 Receiver には、ユーザーがメッセージを送信するときに呼び出されるリスナーがアタッチされていることに注意してください。
ファイル: MySender.javaimport java.io.BufferedReader; import java.io.InputStreamReader; import javax.naming.*; import javax.jms.*; public class MySender { public static void main(String[] args) { try { //Create and start connection InitialContext ctx=new InitialContext(); QueueConnectionFactory f=(QueueConnectionFactory)ctx.lookup('myQueueConnectionFactory'); QueueConnection con=f.createQueueConnection(); con.start(); //2) create queue session QueueSession ses=con.createQueueSession(false, Session.AUTO_ACKNOWLEDGE); //3) get the Queue object Queue t=(Queue)ctx.lookup('myQueue'); //4)create QueueSender object QueueSender sender=ses.createSender(t); //5) create TextMessage object TextMessage msg=ses.createTextMessage(); //6) write message BufferedReader b=new BufferedReader(new InputStreamReader(System.in)); while(true) { System.out.println('Enter Msg, end to terminate:'); String s=b.readLine(); if (s.equals('end')) break; msg.setText(s); //7) send message sender.send(msg); System.out.println('Message successfully sent.'); } //8) connection close con.close(); }catch(Exception e){System.out.println(e);} } }ファイル: MyReceiver.java
import javax.jms.*; import javax.naming.InitialContext; public class MyReceiver { public static void main(String[] args) { try{ //1) Create and start connection InitialContext ctx=new InitialContext(); QueueConnectionFactory f=(QueueConnectionFactory)ctx.lookup('myQueueConnectionFactory'); QueueConnection con=f.createQueueConnection(); con.start(); //2) create Queue session QueueSession ses=con.createQueueSession(false, Session.AUTO_ACKNOWLEDGE); //3) get the Queue object Queue t=(Queue)ctx.lookup('myQueue'); //4)create QueueReceiver QueueReceiver receiver=ses.createReceiver(t); //5) create listener object MyListener listener=new MyListener(); //6) register the listener object with receiver receiver.setMessageListener(listener); System.out.println('Receiver1 is ready, waiting for messages...'); System.out.println('press Ctrl+c to shutdown...'); while(true){ Thread.sleep(1000); } }catch(Exception e){System.out.println(e);} } }ファイル: MyListener.java
import javax.jms.*; public class MyListener implements MessageListener { public void onMessage(Message m) { try{ TextMessage msg=(TextMessage)m; System.out.println('following message is received:'+msg.getText()); }catch(JMSException e){System.out.println(e);} } }
最初に Receiver クラスを実行し、次に Sender クラスを実行します。
JMSトピックの例
JMS キューと同じですが、キューをトピックに、送信者をパブリッシャーに、受信者をサブスクライバーに変更する必要があります。
という名前の 2 つの JNDI を作成する必要があります。 myTopicConnectionFactory そして 私のトピック 。
ファイル: MySender.javaimport java.io.BufferedReader; import java.io.InputStreamReader; import javax.naming.*; import javax.jms.*; public class MySender { public static void main(String[] args) { try { //Create and start connection InitialContext ctx=new InitialContext(); TopicConnectionFactory f=(TopicConnectionFactory)ctx.lookup('myTopicConnectionFactory'); TopicConnection con=f.createTopicConnection(); con.start(); //2) create queue session TopicSession ses=con.createTopicSession(false, Session.AUTO_ACKNOWLEDGE); //3) get the Topic object Topic t=(Topic)ctx.lookup('myTopic'); //4)create TopicPublisher object TopicPublisher publisher=ses.createPublisher(t); //5) create TextMessage object TextMessage msg=ses.createTextMessage(); //6) write message BufferedReader b=new BufferedReader(new InputStreamReader(System.in)); while(true) { System.out.println('Enter Msg, end to terminate:'); String s=b.readLine(); if (s.equals('end')) break; msg.setText(s); //7) send message publisher.publish(msg); System.out.println('Message successfully sent.'); } //8) connection close con.close(); }catch(Exception e){System.out.println(e);} } }ファイル: MyReceiver.java
import javax.jms.*; import javax.naming.InitialContext; public class MyReceiver { public static void main(String[] args) { try { //1) Create and start connection InitialContext ctx=new InitialContext(); TopicConnectionFactory f=(TopicConnectionFactory)ctx.lookup('myTopicConnectionFactory'); TopicConnection con=f.createTopicConnection(); con.start(); //2) create topic session TopicSession ses=con.createTopicSession(false, Session.AUTO_ACKNOWLEDGE); //3) get the Topic object Topic t=(Topic)ctx.lookup('myTopic'); //4)create TopicSubscriber TopicSubscriber receiver=ses.createSubscriber(t); //5) create listener object MyListener listener=new MyListener(); //6) register the listener object with subscriber receiver.setMessageListener(listener); System.out.println('Subscriber1 is ready, waiting for messages...'); System.out.println('press Ctrl+c to shutdown...'); while(true){ Thread.sleep(1000); } }catch(Exception e){System.out.println(e);} } }ファイル: MyListener.java
import javax.jms.*; public class MyListener implements MessageListener { public void onMessage(Message m) { try{ TextMessage msg=(TextMessage)m; System.out.println('following message is received:'+msg.getText()); }catch(JMSException e){System.out.println(e);} } }