学習JMS(Javaの)

Javaメッセージサービスとは何ですか

これは、Javaアプリケーションの開発をサポートするために、など、作成、送信、メッセージを読むなど、標準のメッセージプロトコルおよびメッセージサービスのための共通のインターフェースを提供し、2つのアプリケーションAPIとの間の非同期通信のためのJavaメッセージサービスを指し、 。2つのJMSアプリケーションは、それらの間の通信に使用するJ2EEでは、直接接続されていませんが、一般的なメッセージングサービスを介して接続されている、デカップリング効果を達成することができ、我々は次になります詳細チュートリアル。

なぜ我々は、JMSが必要なのか

JAVAでは、2つのアプリケーション間の場合でも、これら2つのプログラムが異なる大陸に配備することができる、自分で理解していないので、どのようにそれらの間でメッセージを送信するには?例えば、インドA、米国で展開し、別のアプリケーションにデプロイされたアプリケーションは、その後、何かがA、BはAからのいくつかの更新情報を取得したいときにトリガされます もちろん、A、Bへの関心の複数の更新情報であってもよく、Bは、N個のアプリケーションと同様A.から更新された情報を取得することができます

  この場合は、JAVAは、最善の解決策の-JMS、上述の問題に最適なソリューションを提供します。

  同じことは、このようなサーバーに接続しているすべてのクライアントにイベントメッセージを送信するための放出機構を必要とするチャットサービス、などのJMSベースのアプリケーションのイベントに適用されます。JMSとRMIは、メッセージを送信する場合、受信者がオンライン必要はありません異なっています。サーバは、メッセージ、問題を送信し、サーバーから送信されたメッセージの受信を確実にするために、ライン上のクライアントまで待ちます。これは、今日の世界では、多くの一般的な問題を扱うことができる非常に強力なソリューションです。

JMSの利点

非同期な

  JMSは、クライアントがメッセージを取得し、要求を送信するためのイニシアチブを取る必要がない場合、メッセージは自動的に使用可能なクライアントに送信され、本質的に非同期です。

信頼性の高いです

  JMSは、メッセージが一度だけ配信されることを確実にします。私たちは、繰り返しの問題は、メッセージを作成遭遇してきた、とJMSは、あなたがこの問題を回避するのに役立ちます。

JMSメッセージングモデル

JMS APIが表示される前に、製品のほとんどは、「ポイント」を使用して、メッセージを通信するためのいずれかの方法で「パブリッシュ/サブスクライブ」。JMSは、彼らが互いに独立しており、2つのメッセージング仕様モデルを定義します。任意のJMSプロバイダは、それが自分の選択で、そのうちの一つまたは二つのモデルを実装することができます。JMS仕様では、JMS APIに基づく弊社で用意されたプログラムは、すべてのモデルに適用可能であることを保証するために、共通のインタフェースを提供します。

  私たちは、より詳細に、この2つのメッセージ配信モデルを見てみましょう:

メッセージングモデルをポイントツーポイント

  点でメッセージングモデル、送信側、受信側コンポーネントによってアプリケーション・メッセージ・キューを指すように。そのすべてのメッセージを保存する(期限切れ除くと、メッセージの受信者が出て消費された)特別なメッセージキューに送られた各メッセージを送信しました。次のようにメッセージングモデルを指すようにポイントはいくつかの特徴があります。

  • 各メッセージは、唯一の受信者です。
  • メッセージ送信者と受信者は、時間に依存していません。
  • メッセージの送信者は、メッセージを送信するときは、関係なく、プログラム内の受信者で実行されていないのは、メッセージを取得することができます。
  • 受信者がメッセージを受信すると、それは領収書(確認応答)の確認応答を送信します。

パブリッシュ/メッセージングモデルをサブスクライブ

  パブリッシュ/サブスクライブ・メッセージング・モデルでは、パブリッシャーは、トピックによって、すべてのクライアントにメッセージ、およびメッセージをリリースしました。このモデルでは、お互いを知らないパブリッシャとサブスクライバは、匿名で、動的に公開して話題を購読することができます。メッセージがクライアントに配信されるまでの保存とメッセージ、およびメッセージを届けるための主なトピックは、保存されたままになります。

次のようにモデル特性があるメッセージングパブリッシュ/サブスクライブ:

  • メッセージは、複数の加入者に渡すことができます
  • パブリッシャとサブスクライバは、時間依存のクライアントがメッセージを受信するためにサブスクリプションを作成し、加入者がメッセージを受信するためにアクティブなままにする必要があるだけです。
  • そのような厳密な時間相関を緩和するために、JMSは、加入者が永続的なサブスクリプションを作成することができます。このように、加入者が(実行)が起動されていない場合でも、それはまた、メッセージのパブリッシャを受け取ることができます。

メッセージを受信します

JMSにおいて、受信したメッセージは、2つの方法で使用することができます。

シンクロナス

  同期モードを使用してメッセージを受信し、そのメッセージを加入者コールは()メソッドを受け取ります。()受信では、メッセージは、指定された時間に達していない、または前に、本方法は、メッセージが使用可能になるまでブロックされます。

非同期な

  非同期メッセージを受信し、メッセージの加入者がイベントリスナーに似たメッセージリスナを登録する必要がある限り、メッセージが到着すると、JMSサービスプロバイダは、リスナーのonMessage()を呼び出すことによって、メッセージを配信します。

JMSプログラミングインタフェース

JMSアプリケーションは、以下の基本モジュールで構成されています。

  1. 管理オブジェクト(管理対象オブジェクト) - 接続ファクトリ(接続ファクトリ)と宛先(デスティネーション)
  2. 接続オブジェクト(接続)
  3. セッション(セッション)
  4. プロデューサメッセージ(メッセージプロデューサ)
  5. メッセージコンシューマ(メッセージコンシューマ)
  6. メッセージリスナ(メッセージリスナ)

JMS管理オブジェクト

管理オブジェクト(管理対象オブジェクト)はJMSクライアントを使用して、システム管理者によって作成された事前設定されたJMSオブジェクトである、管理対象となる2つのオブジェクトがあります。

  • 接続ファクトリー(のConnectionFactory)
  • デスティネーション(目的地)

システム管理者はJMS、JNDIネームスペースやJNDIレジストリによって作成されたアプリケーションサーバーの管理コンソールを使用することにより、2つの管理対象オブジェクトは、アプリケーション・サーバーに格納されています。

接続ファクトリー(のConnectionFactory)

クライアントは、それがJMSサービスプロバイダとクライアント間の接続を作成し、サービスプロバイダに接続するためにJMS接続ファクトリオブジェクトを使用しています。(例えば、送信者や受信者など)JMSクライアントがを検索し、接続JNDI名前空間を取得します。この接続を使用すると、クライアントは、キューの対象、缶、または送信/送信先通信でメッセージを受信します。さんがメッセージを送信する方法を理解するために例を使用してみましょう:

QueueConnectionFactory queueConnFactory = (QueueConnectionFactory) initialCtx.lookup ("primaryQCF");
Queue purchaseQueue = (Queue) initialCtx.lookup ("Purchase_Queue");
Queue returnQueue = (Queue) initialCtx.lookup ("Return_Queue");

デスティネーション(目的地)

指定された宛先、およびメッセージを受信する宛先クライアントは、メッセージの送信元を送りました。2つの宛先、キューとトピックを使用してJMS。コードの後に​​は、キューとトピックを指定します。

キュー・セッションの作成

QueueSession ses = con.createQueueSession (false, Session.AUTO_ACKNOWLEDGE);  //get the Queue object  
Queue t = (Queue) ctx.lookup ("myQueue");  //create QueueReceiver  
QueueReceiver receiver = ses.createReceiver(t); 

トピックセッションを作成します。

TopicSession ses = con.createTopicSession (false, Session.AUTO_ACKNOWLEDGE); // get the Topic object  
Topic t = (Topic) ctx.lookup ("myTopic");  //create TopicSubscriber  
TopicSubscriber receiver = ses.createSubscriber(t);  

JMS接続

Connectionオブジェクトは、我々はConnectionFactoryオブジェクトを持っている場合、あなたは接続を作成するために使用することができ、プロバイダとJMSいる間の仮想接続をカプセル化します。

Connection connection = connectionFactory.createConnection();

接続を作成したら、使用するプログラムの終了後に、それをクローズする必要があります。

connection.close();

JMSセッション(セッション)

セッションがメッセージを生成し、消費するためのシングルスレッドコンテキストで、メッセージプロデューサとメッセージコンシューマを作成することができます。

セッションSessionオブジェクトは、接続を作成した後、インターフェイスを実装し、我々は、セッションを作成するためにそれを使用することができます。

Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

JMSメッセージプロデューサ

セッションが作成したニュースの生産者は、宛先にメッセージを送信するために使用しました。プロデューサーは、MessageProducerがインターフェイスを実現する、我々は目的地、キューまたはトピックとしてプロデューサーを作成することができます。

MessageProducer producer = session.createProducer(dest);
MessageProducer producer = session.createProducer(queue);
MessageProducer producer = session.createProducer(topic);

あなたはsendメソッドを使用してメッセージを送信できるメッセージプロデューサを作成した後:

producer.send(message);

JMSメッセージのコンシューマ

ニュースの消費者は、宛先によって送信されたメッセージを受け入れるために、セッションによって作成されました。消費者は、我々は消費者の目的地、キューまたはトピックを作成することができ,,のMessageConsumerインタフェースを実現します。

MessageConsumer consumer = session.createConsumer(dest);
MessageConsumer consumer = session.createConsumer(queue);
MessageConsumer consumer = session.createConsumer(topic);

JMSメッセージ・リスナー

JMS消息监听器是消息的默认事件处理者,他实现了MessageListener接口,该接口包含一个onMessage方法,在该方法中需要定义消息达到后的具体动作。通过调用setMessageListener方法我们给指定消费者定义了消息监听器

Listener myListener = new Listener();
consumer.setMessageListener(myListener);

JMS客户端使用JMS消息与系统通讯,JMS消息虽然格式简单但是非常灵活, JMS消息由三部分组成:

消息头

JMS消息头预定义了若干字段用于客户端与JMS提供者之间识别和发送消息,预编译头如下:

– JMSDestination
– JMSDeliveryMode
– JMSMessageID
– JMSTimestamp
– JMSCorrelationID
– JMSReplyTo
– JMSRedelivered
– JMSType
– JMSExpiration
– JMSPriority

消息属性

我们可以给消息设置自定义属性,这些属性主要是提供给应用程序的。对于实现消息过滤功能,消息属性非常有用,JMS API定义了一些标准属性,JMS服务提供者可以选择性的提供部分标准属性。

消息体

在消息体中,JMS API定义了五种类型的消息格式,让我们可以以不同的形式发送和接受消息,并提供了对已有消息格式的兼容。不同的消息类型如下:

Text message : javax.jms.TextMessage,表示一个文本对象。
Object message : javax.jms.ObjectMessage,表示一个JAVA对象。
Bytes message : javax.jms.BytesMessage,表示字节数据。
Stream message :javax.jms.StreamMessage,表示java原始值数据流。
Map message : javax.jms.MapMessage,表示键值对。

 

使用案列:基于Tomcat + JNDI + ActiveMQ实现JMS的点对点消息传送
JMS发布/订阅消息传送例子

https://www.cnblogs.com/chenpi/p/5566983.html

 

 

おすすめ

転載: blog.csdn.net/chehec2010/article/details/93471826