「最後の一つは:ActiveMQのは、シリーズIIをはじめコード例(ポイントツーポイント)入門ポイント(PTP)をポイントし、モデル(パブ&サブ)をパブリッシュ/サブスクライブするには、アドホックモードと使用が導入されていますActiveMQの2つのモードでいいます」コード例を説明するが、今日は/次の導入をサブスクライブ・モデルを公開します。
まず、理論的基礎
パブリッシュ/作業のモデル図を購読します:
- メッセージプロデューサのメッセージメッセージを消費(サブスクリプション)を使用すると、同時に消費者に複数のメッセージを持つことができ、トピックに(公開)。
- そしてポイントは、さまざまな方法でポイントするために、トピックに投稿されたメッセージはすべてのサブスクライバによって消費されます。
- プロデューサーは関係なく、消費者がメッセージを保存しませんかのことを発表したとき。
- 消費者は、メッセージのプロデューサ後の最初のメッセージ、しなければなりません。
第二に、コードの実装
- プロデューサー
パッケージ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)を呼び出すことですパブリッシュ/サブスクライブ。
- 消費者
以下のためのパッケージ変更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つのモデルが比較します
さて、ここでは、完成し紹介するモデルをパブリッシュ/サブスクライブ。
あなたが収穫した場合、あなたは賛美聖歌を指します