1。非同期通信
私たちが以前に接触したRMI、ヘシアン、およびその他の技術はすべて、すべて同期通信メカニズムです。クライアントがリモートメソッドを呼び出す場合、クライアントは実行を続ける前にリモートメソッドが完了するまで待つ必要があります。クライアントはこの期間中にブロックされます(これにより、非常に悪いユーザーエクスペリエンスが発生します)。
(同期通信)
同期通信は、プログラム間で相互作用する唯一の方法ではありません。非同期通信メカニズムでは、クライアントは、サービスがメッセージを処理するのを待つ必要がなく、実行を続け、最終的にメッセージを受信して処理することができます。
(非同期コミュニケーション)
非同期コミュニケーションの利点
待つ必要はありません。クライアントはメッセージブローカーにメッセージを送信するだけで、待機せずに他のタスクを実行し続けることができ、メッセージが対応する宛先に配信されることを確認できます。
メッセージ指向およびデカップリング。クライアントは、リモートサービスのインターフェイス仕様について心配する必要はありません。メッセージをメッセージキューに入れて結果を取得するだけです。
2。JMS
1。はじめに
JMSが出現する前に、各メッセージブローカーには異なる実装があり、さまざまなブローカー間のメッセージコードが普遍的になるのが難しくなりました。 JMS(Javaメッセージサービス)は、メッセージブローカーを使用する一般的なAPIを定義する標準です。つまり、仕様に準拠するすべての実装は、データベース操作に共通のインターフェイスを提供するJDBCと同様に、共通のインターフェイスを使用します。
JMSのいくつかの重要な要素:
宛先:メッセージが送信者から送信されるチャネル。
ConnectionFactory:接続ファクトリー、接続オブジェクトの作成に使用されます。
接続:セッションの作成に使用される接続インターフェイス。
セッション:セッションインターフェイス、送信者、メッセージの受信者、およびメッセージオブジェクト自体を作成するために使用されます。
MessageCossumer:メッセージの消費者。
MessageProducer:メッセージのプロデューサー。
xxxmessage:バイテーメージ、MapMessage、ObjectMessage、StreamMessage、TextMessageの5種類を含むさまざまなタイプのメッセージオブジェクト。
2。JMSメッセージモデル
異なるメッセージシステムには異なるメッセージモデルがあります。 JMSは、キュー(ポイントツーポイント)とトピック(公開/購読)の2つのモデルを提供します。
JMSキュー(ポイントツーポイント)モデル
ピアツーピアモデルでは、メッセージプロデューサーはメッセージを作成してキューに送信し、メッセージを消費者がキューから取り出してメッセージを消費しますが、繰り返し消費することはできません。
写真に示されているように:
送信者1、送信者2、および送信者3はそれぞれサーバーにメッセージを送信します。
メッセージ1、2、および3は順番にキューを形成し、キュー内のメッセージはどの受信者が消費されるかを知りません。
受信者1、2、および3は、それぞれ消費のためにキューからメッセージを取得します。メッセージが取得されるたびに、キューはメッセージを削除し、メッセージが繰り返し消費されないようにします。
JMSキューモデルもP2P(ポイントトゥポイント)モデルになりました。
JMSトピック(公開/購読)モデル
JMSトピックモデルとJMSキューモデルの最大の違いは、メッセージの受信の部分にあります。トピックモデルは、WeChatの公式アカウントに似ています。公式アカウントを購読する受信者は、公式アカウントによってプッシュされたメッセージを受信できます。
写真に示されているように:
パブリッシャー1、2、3出版3トピック1、2、3。
このようにして、トピック1に登録するユーザーグループは、サブスクライバー1、2、3がトピック1メッセージを受信できます。同様に、サブスクライバー4、5、6はトピック2メッセージを受信でき、サブスクライバー7、8、9はトピック3メッセージを受信できます。
JMSトピックモデルもPUS/SUBモデルになりました。
2つのモードの各要素の比較:
3。従来のJMSプログラミングモデル
プロデューサー:
(1)接続ファクトリー接続の構成を作成します。
(2)接続工場を使用して接続を作成します。
(3)接続を開始します。
(4)セッションを作成します。
(5)メッセージ送信の宛先を作成します。
(6)プロデューサーを作成します。
(7)メッセージの種類とメッセージコンテンツを作成します。
(8)メッセージを送信します。
消費者:
(1)接続ファクトリー接続の構成を作成します。
(2)接続工場を使用して接続を作成します。
(3)接続を開始します。
(4)セッションを作成します。
(5)メッセージ送信の宛先を作成します。
(6)消費者を作成する(7)メッセージタイプを作成します。
(8)メッセージを受信します。
3。ActiveMQの紹介
ActiveMQは、Apacheが制作した最も人気のある強力なオープンソースメッセージバスです。 ActiveMQは、JMS1.1およびJ2EE 1.4仕様を完全にサポートするJMSプロバイダーの実装です。 JMS仕様は長い間導入されてきましたが、JMSは依然として今日のJ2EEアプリケーションの中で特別な役職を務めています。
ActiveMQメイン機能:
複数の言語とプロトコルでクライアントを書く。言語:Java、C、C ++、C#、Ruby、Perl、Python、Php。アプリケーションプロトコル:
OpenWire、Stomp Rest、WS通知、XMPP、AMQP
JMS1.1およびJ2EE 1.4仕様の完全なサポート(永続性、XAメッセージ、トランザクション)
Springサポートのために、ActiveMQはSpringを使用してシステムに簡単に埋め込むことができ、Spring 2.0の機能もサポートできます。一般的なJ2EEサーバー(Geronimo、JBoss 4、Glassfish、Weblogicなど)のテストに合格しました。 JCA 1.5リソースアダプターの構成を通じて、ActiveMQは互換性のあるJ2EE 1.4商用サーバーに自動的に展開でき、IN-VM、TCP、SSL、NIO、UDP、JGROUPS、JXTAの複数の伝送プロトコルをサポートできます。
JDBCとジャーナルを介した高速メッセージの永続性をサポートします。これにより、AJAXの高性能クラスター、クライアントサーバー、ポイントツーポイントサポートが保証されます。
軸との統合をサポートして、テストのために埋め込まれたJMSプロバイダーを簡単に呼び出す
4。activemq実際の戦闘
ActiveMQが単純なメッセージキューをどのように実施するかを見てみましょう。
従来のJMSプログラミングモデル
1。JMSキューモデルコードの実装:
プロデューサー:
パッケージcom.wgs.mq.queue; Import org.apache.activemq.activemqconnectionFactory; Import javax.jms。*;/*** genshenwang.nomicoが2017/10/19に作成しました。 */public class activemqproducer {private static final string url = "tcp:// localhost:61616"; private static final string queue_name = "queue-name"; public static void main(string [] args)throws jmsexception {//接続ファクトリー接続を使用して接続を作成する接続= ConnectionFactory.CreateConnection(); // 3 Connection Connection.start(); // 4を起動するセッションセッション= connection.cleatesession(false、session.auto_acknowledge); // 5メッセージを送信するための宛先を作成する宛先session.createproducer(destination); // 7 textmessage textmessage = session.createTextmessage(); for(int i = 1; i <= 100; i ++){// 8 message message content textmessage.settext( "sender-1 -send message:"+i); // 9 send message producer.send(textmessage);} system.out.println( "メッセージが正常に送信された"); session.close(Conusmer:
パッケージcom.wgs.mq.queue; Import org.apache.activemq.activemqconnectionFactory; Import javax.jms。*;/*** genshenwang.nomicoが2017/10/19に作成しました。 */public class activemqconsumer {private static final string url = "tcp:// localhost:61616"; private static final string queue_name = "queue-name"; public static void main(string [] args)throws jmsexception {//接続ファクトリ接続を使用して接続を作成する接続= ConnectionFactory.CreateConnection(); // 3 Connection Connection.start(); // 4を起動するセッションセッション= Connection.Cleatesession(False、Session.Auto_ackNowledge); // 5メッセージを送信するための宛先を作成する宛先=セッションsession.createconsumer(宛先); MessageConsumer.setMessagElistener(new MessageListener(){public void onmessage(メッセージメッセージ){// 7 TextMessage TextMessage =(TextMessage)メッセージを作成する{// 7受信メッセージSystem.out.println( "Consuner -1 -1-受信メッセージ:[" + textectect.tect. et(); {e.printstacktrace();}}});}}2。JMSトピックモデルコードの実装:
プロデューサー:
パッケージcom.wgs.mq.topic; Import org.apache.activemq.activemqconnectionfactory; Import javax.jms。*;/*** genshenwang.nomicoによって作成されたサブスクリプションモードを公開します。 */public class ActiveMQProducer {private static final String URL = "tcp://localhost:61616";private static final String TOPIC_NAME = "topic-name";public static void main(String[] args) throws JMSException {//1 Create a connection factory ConnectionFactoryConnectionFactory connectionFactory = new ActiveMQConnectionFactory(URL);//2 Create a connection using接続ファクトリ接続= connectionfactory.createconnection(); // 3 Connection connection.start(); // 4セッションセッション= connection = connectsessession(false、session.auto_acknowledge); // 5トピックでメッセージを送信する宛先を作成する宛先= session.createtopic(topic_name); // session.createproducer(宛先); // 7メッセージを作成するtextmessage textmessage = session.createTextmessage(); for(int i = 1; i <= 100; i ++){// 8 message message content textmessage.settext( "sender-1 -send message:"+i); // 9 send message producer.send(textmessage);} system.out.println( "メッセージが正常に送信された"); session.close(消費者:
パッケージcom.wgs.mq.topic; Import org.apache.activemq.activemqconnectionfactory; Import javax.jms。*;/*** genshenwang.nomicoによって作成されたサブスクリプションモードを公開します。 */public class ActiveMQConsumer {private static final String URL = "tcp://localhost:61616";private static final String TOPIC_NAME = "topic-name";public static void main(String[] args) throws JMSException {//1 Create a connection factory ConnectionFactoryConnectionFactory connectionFactory = new ActiveMQConnectionFactory(URL);//2 Create a connection using接続ファクトリ接続= ConnectionFactory.CreateConnection(); // 3 Connection.start(); // 4 Starting Session Session = Connection.Createssession(False、Session.Auto_AckNowledge); // session.createconsumer(宛先); MessageConsumer.setMessagElistener(new MessageListener(){public void onmessage(メッセージメッセージ){// 7 Textmessage textmessage =(textmessage)メッセージを作成する{// 7受信メッセージSystem.out.println( "消費者-1-受信メッセージ:[" + textmessage.gettext e){e.printstacktrace();}}}});}}スプリングを使用したJMSテンプレート
JMSは、JDBCのようなすべてのメッセージブローカーに統一されたインターフェイスを提供しますが、接続、ステートメント、結果セット、例外を処理すると複雑に見える場合があります。ただし、SpringはJMSTEMプレートを提供して、冗長および重複したJMSコードを排除します。
JMSTEMPLATEを使用してメッセージキューを実装する方法を見てみましょう。
1。JMSキューモデルコードの実装:
構成ファイル:
producer.xml:
<?xml version = "1.0" encoding = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns:xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns:context = "http://www.springframework.org/schema/context" xsi:schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.orgwork.org/schems.spring/ http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd "> <context:annotation-config/> <! - connectionfactoryが提供するactivemq-> <bean = <bean name = "brokerurl" value = "tcp:// localhost:61616"/> </bean> <! - springでjms接続ファクトリを構成するようにActivemq - > <bean id = "connectionfactory"> <プロパティname = "ターゲットコネクションファクトリー" ref = "regonectionfactory"/> </bean < <bean id = "jmstemplate"> <プロパティ名= "connectionfactory" ref = "connectionfactory"/> </bean> <! - キューの宛先の名前を構成 - > <bean id = "queuedestination"> <constructor-arg値= " <constructor-arg value = "topic-spring-name"/> </bean> <bean id = "producerserviceimpl"/> </beans>
Consumer.xml:
<?xml version = "1.0" encoding = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns:xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns:context = "http://www.springframework.org/schema/context" xsi:schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.orgwork.org/schems.spring/ http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd "> <context:annotation-config/> <! - connectionfactoryが提供するactivemq-> <bean = <bean name = "brokerurl" value = "tcp:// localhost:61616"/> </bean> <! - springでjms接続ファクトリを構成するようにactivemqによって提供される接続ファクトリーに接続します - > <bean id = "connectionfactory"> <プロパティname = "ターゲットコネクションファクトリー" ref = "reftientory" <bean id = "queuedestination"> <constructor-arg value = "queue-spring-name"/> </bean> <! - メッセージリスナーを構成 - > <bean id = "cossanermessagelistener"/> <! - キューの宛先の名前を構成 - > <bean id = "jmscontainer"> < name = "ConnectionFactory" Ref = "ConnectionFactory"/> <プロパティ名= "MessageListener" Ref = "ConsumermessageListener"/> </bean> <! - キューの宛先の名前を構成 - > <bean id = "topicdestination"> <constructor-arg value = "topic-spring-name"/> </bean </bean </bean </bean
プロデューサー:
(1)最初にインターフェイスを書く:
パッケージcom.wgs.jms.producer;/*** genshenwang.nomicoが2017/10/20に作成しました。 */パブリックインターフェイスActiveMQProducerService {void sendMessage(最終文字列メッセージ);}(2)インターフェイスの実装:
パッケージcom.wgs.jms.producer; import org.springframework.beans.factory.annotation.autowired; import org.springframework.jms.core.jmystemplate; Import org.springframework.jms.core.messageCreator; Import.notation.annotation.annotation; Genshenwang.Nomico 2017/10/20。 */パブリッククラスActiveMQProducerServiceImplはActiveMQProducerService {@autowired jmStemplate JMSTEMPLATE; @Resource(name = "Queuedestination")目的地;パブリックボイドセンドメッシージ(最終文字列メッセージ){jmstemplate.sendage(jmstemplate.semsage){jmstemplate.semessage() {textmessage textmessage = session.createTextmessage(message); return textmessage;}}); system.out.println( "producer- 1 -send message:" + message);}}}(3)テスト:
パッケージcom.wgs.jms.producer; Import org.springframework.context.support.classpathxmlapplicationcontext;/***は、2017/10/20にgenshenwang.nomicoによって作成されました。 */public class ActivemqProducermain {public static void main(string [] args){classpathxmlapplicationContext = new classpathxmlapplicationContext( "producer.xml"); activemqproducerervice service = context.getbean(activemqproducerervice.class); {service.sendmessage( "test" + i);} context.close();}}}消費者:
(1)メッセージリスナーを作成します。
パッケージcom.wgs.jms.consumer; Import javax.jms.jmsection; Import javax.jms.message; Import javax.jms.messageListener; Import javax.jms.textmessage;/*** Genshenwang.nomicoが2017/10/20に作成しました。 */public class consumermessageListenerはmessageListener {public void onmessage(message message){try {textmessage textmessage =(textmessage)message; system.out.println( "Consumer -1 -Receiveメッセージ:" + TextMessage.getText()(2)テスト:
パッケージcom.wgs.jms.consumer; Import org.springframework.context.support.classpathxmlapplicationcontext;/***は、2017/10/20にgenshenwang.nomicoによって作成されました。 */public class ActiveMQCONSUMERMAN {public static void main(string [] args){classPathxMlApplicationContext = new ClassPathxMLApplicationContext( "Consumer.xml");}}}2。JMSトピックモデルコードの実装:
上記のコードに表示されるQueuedestinationをToppistentinationに変更するだけです。
要約します
上記は、JMSの導入とActiveMQの実際のコードに関するこの記事のすべての内容です。私はそれが誰にでも役立つことを願っています。興味のある友人は、このサイトの他の関連トピックを引き続き参照できます。欠点がある場合は、それを指摘するためにメッセージを残してください。このサイトへのご支援をありがとうございました!