シリーズ3はじめのActiveMQ:パブリッシュ/サブスクライブ・モデル

「最後の一つは:ActiveMQのは、シリーズIIをはじめコード例(ポイントツーポイント)入門ポイント(PTP)をポイントし、モデル(パブ&サブ)をパブリッシュ/サブスクライブするには、アドホックモードと使用が導入されていますActiveMQの2つのモードでいいます」コード例を説明するが、今日は/次の導入をサブスクライブ・モデルを公開します。

まず、理論的基礎

パブリッシュ/作業のモデル図を購読します:

  • メッセージプロデューサのメッセージメッセージを消費(サブスクリプション)を使用すると、同時に消費者に複数のメッセージを持つことができ、トピックに(公開)。
  • そしてポイントは、さまざまな方法でポイントするために、トピックに投稿されたメッセージはすべてのサブスクライバによって消費されます。
  • プロデューサーは関係なく、消費者がメッセージを保存しませんかのことを発表したとき。
  • 消費者は、メッセージのプロデューサ後の最初のメッセージ、しなければなりません。

第二に、コードの実装

  1. プロデューサー
    パッケージcom.sam.topic。
    
    輸入org.apache.activemq.ActiveMQConnectionFactory; 
    
    インポートするjavax.jms *。; 
    
    / ** 
     * @author JAVA开发老菜鸟
     * 
     * / 
    パブリック クラスTopicProducer { 
    
        公共の 静的な 最終   文字列QUEUE_NAMEは= "トピックのデモ"。// 队列名
    
        公共 ボイド生産者(文字メッセージ)がスローたJMSException { 
            ConnectionFactoryの工場 = ヌル
            接続の接続 = nullを
            セッションsession =ヌル; 
            のMessageProducerプロデューサー = ヌル;
             試み{
                 / ** 
                 *接続ファクトリー1.作成します
                 つまり、ユーザー名、パスワード、接続アドレス:*植物の作成を、コンストラクタは、3つのパラメータを持っている
                 *引数なしのコンストラクタは:はlocalhost、デフォルトの接続アドレスを持っています
                 *つのパラメータ:認証なしモード、ユーザ認証
                 * 3つのパラメータ:認証および接続のアドレス
                 * / 
                工場 = 新新 ActiveMQConnectionFactory( "ADMIN"、 "ADMIN"、 "TCP:// localhostを:61616" );
                 / ** 
                 * 2.接続を作成する
                 *何のパラメータは
                 、パラメータはありません*:ユーザー名、パスワード
                 * / 
                接続 = factory.createConnection();
                / ** 
                 * 3.スタート接続
                 *生産を開始することはできませんので、送信するメッセージがバックチェック
                 あなたは、接続が自動的に起動します開始しなかった場合* 
                 あなたは特別な設定は、接続が完了した後に起動するように設定する必要がある場合* 
                 * / 
                接続。 (START); 
                / ** 
                 * 4.接続セッションを作成する
                 二つのパラメータがあります*:サービスの必要性、メッセージの受信確認を。
                 *生産のためのサポートサービスは、2番目のパラメータが無効である場合は、提案の着信セッション。 SESSION_TRANSACTED 
                 *あなたがトランザクションをサポートしていない場合は、2番目の引数は渡され、効果的なする必要があります
                 * 
                 * AUTO_ACKNOWLEDGE:ハンドリング自動確認メッセージの後に自動確認(商業的利用が推奨されていません)
                 * CLIENT_ACKNOWLEDGE:クライアントの手動確認は、手動で取り扱い、消費者を確認する必要があります
                 * DUPS_OK_ACKNOWLEDGE :そこにクライアントの手動確認のコピーは、あるメッセージは、複数の治療法(推奨されません)であってもよい
                 * / 
                セッション = connection.createSession(、Session.AUTO_ACKNOWLEDGE);
                 / ** 
                 *セッションに5.先(サブジェクト)を作成し、生産者、メッセージは
                 *キュー名が一意のラベルキューである
                 *プロデューサーは、宛先を指定することはできません場合は、送信時間をすることができ作成します指定
                 * / 
                あなたが欲しいん先 = session.createTopic(queue_nameの); 
                プロデューサー = session.createProducer(あなたが欲しいん); 
                のTextMessageのTextMessage = session.createTextMessage(メッセージ);
                 / ** 
                 * 6.先にプロデューサが送信メッセージ
                 * / 
                producer.send (のTextMessage)
                のSystem.out.println( "正常に送信されたメッセージ" ); 
            } キャッチ(例外EX){
                スローEXを。
            } 最後に{
                 / ** 
                 * 7释放资源
                 * / 
                場合(プロデューサー!= NULL ){ 
                    producer.close()。
                } 
    
                であれば(セッション!= NULL ){ 
                    session.close()。
                } 
    
                であれば(接続!= NULL ){ 
                    connection.close(); 
                } 
            } 
        } 
    
        パブリック 静的 ボイドメイン(文字列[]引数){ 
            TopicProducerプロデューサー = 新しいですTopicProducer();
            してみてください{ 
                producer.producer( "こんにちは、ActiveMQの" ); 
            } キャッチ(例外例){ 
                ex.printStackTrace(); 
            } 
        } 
    }

    サブスクリプションモデルとの主な違いは、宛先を作成する方法です/プロデューサー、コード・ポイントモードを公開し、アドホックモードはsession.createQueue(QUEUE_NAME)が呼び出され、そしてモデルがsession.createTopic(QUEUE_NAME)を呼び出すことですパブリッシュ/サブスクライブ。

  2. 消費者
    以下のためのパッケージ変更com.sam.topic; 
    
    インポートorg.apache.activemq.ActiveMQConnectionFactory; 
    
    インポートするjavax.jms。* ;
     輸入にjava.io.IOException; 
    
    / ** 
     * @authorの古い新人のJAVA開発
     * 
     *オブザーバー消費量-消費量を監視
     * / 
    パブリック クラスて、TopicConsumerは{ 
    
        公共 ボイド消費者()スローは、IOException {たJMSExceptionを
            ConnectionFactoryの工場 = NULL ; 
            接続の接続 = NULL ; 
            セッションセッション = NULL ;
            MessageConsumerの消費者 = nullを試す{ 
                工場 =  ActiveMQConnectionFactory( "管理者"、 "管理者"、 "TCP:// localhostを:61616" ); 
                接続 = factory.createConnection()。
                / ** 
                 *消费者必须启动连接、否则无法消费
                 * / 
                connection.start(); 
                セッション = connection.createSession(、Session.AUTO_ACKNOWLEDGE)。
                宛先destination = session.createTopic(TopicProducer.QUEUE_NAME)。
                消費者 =session.createConsumer(あなたはどこにしたいですか);
                 / ** 
                 *リスナーが登録され、メッセージキューの変化が自動的にメッセージを自動的に受信して処理するためにリスナーをトリガー
                 * 
                 *リスナー一度永久、登録、プログラムが閉じられるまで
                 *リスナーが登録可能クラスタに対応する複数
                 * ActiveMQの自動ポーリングリスナー複数の並列処理
                 * / 
                consumer.setMessageListener(新しい新規のMessageListener(){ 
                    @Override 
                    公共 ボイドのonMessage(メッセージメッセージ){ 
    
                        試み{ 
                            のTextMessage OM = (のTextMessage)メッセージ。
                            データストリング = om.getText(); 
                            のSystem.out.println(データ)。
                        } キャッチ(たJMSException E){
                            )(e.printStackTraceします。
                        } 
                    } 
                })。
            } キャッチ(例外例){
                 スローEXと、
            } 
        } 
    
        パブリック 静的 ボイドメイン(文字列[]引数){ 
            て、TopicConsumer消費者 = 新しいて、TopicConsumer()。
            試す{ 
                consumer.consumerを(); 
            } キャッチ(例外例){ 
                ex.printStackTrace(); 
            } 
        } 
    }

    ポイントを聞いて、消費者が消費の変化に基づいて指すように、二つの主な違いがあります:1.生産者と同じように、だけでなく、先の別の方法を作成する。2.必要手動でメッセージを確認するために、直接自動確認メカニズム

 

コードが終了し、サブスクライブにより、次のテストでは、複数持つことができ、それぞれが同じメッセージを消費することができますので、我々は2つのコンシューマを開始しました。

まず、実行プロデューサー

私は消費トピックは、コンソールのトピックページに登場し、正常に送信されたメッセージがあるとない定義します

 

そして、2つのコンシューマを行い、2つのコンシューマは任意のメッセージを消費しません。

また、単につ以上の消費者のコンソールページには、ニュースや0を消費しています

 

 なぜ?それを言うために、以前の理論的基礎を覚えていますか?これが理由であります

実行2人の消費者、生産者との前提の下で私たちの良いスタートを続行し、検索します。この時間は、2つのコンシューマはメッセージを消費します

コンソールページの下に見て

これは、メッセージが、ここで、これは2件のメッセージが消費されていることを意味するものではありません2前に発行され、2で消費しているが、2番目のメッセージは、1×2 = 2倍に消費されていること

ない3、今回が4である、あなたは再びプロデューサーを実行することができ、それを信じてはいけません

図3は、送信メッセージ、メッセージ・コンシューマの4倍を蓄積した、2つのバック4は、ここで消費さ= 4 2、2 2、*

 

第三に、2つのモデルが比較します

 

さて、ここでは、完成し紹介するモデルをパブリッシュ/サブスクライブ。

あなたが収穫した場合、あなたは賛美聖歌を指します

おすすめ

転載: www.cnblogs.com/sam-uncle/p/10990324.html