1.キューポイント
メッセージのみが消費者によって消費され、永続的なメッセージであることができる - 消費者が利用できないときには、ロケーション消費されるまで、メッセージが保存され、メッセージが受信されたときには、消費者が応答しない場合、メッセージは保持されますかこれは、消費者が複数の場合で、別の顧客に行くことができます。キューの消費者はより多くの利用可能な場合には、負荷分散は、これらの消費者に役割を果たすことができます。
2.トピック投稿者 - 加入者モデル
各加入者の永続性、顧客の持続的な言葉キューの等価です - メッセージが公開されると、すべての加入者は、(永続的なサブスクリプション非永続サブスクリプション(非永続サブスクリプション)と永続サブスクリプションは、トピックは、2つのモードがあり、受け取ることになります終わり)、デフォルトの非永続的なサブスクリプション。
- 永続性:メッセージが生成され、メッセージが消費されるまで、ファイルやデータベースに保存された、永続メッセージをキュー。
- 非永続:なし消費者支出がない場合にメッセージが保存されません、それは破棄されます
3.コード
- pom.xml
<依存性> <のgroupId> org.springframework.boot </のgroupId> <たartifactId>ばねブートスタータActiveMQの</たartifactId> </依存> <依存性> <のgroupId> org.springframework.boot </のgroupId> <たartifactId >スプリングブートスタータ</たartifactId> </依存> <依存性> <のgroupId> org.springframework.boot </のgroupId> <たartifactId>ばねブートスタータウェブ</たartifactId> </依存>
- application.properties
= 9090はserver.portの ActiveMQの構成で#springboot、springbootは自動的にこれらの接続ファクトリー確立します spring.activemq.broker-TCP = URL:// localhostを:61616 spring.activemq.non偽ブロッキング再配信=へ spring.activemqを。送信タイムアウト0 = 使用して、真の#トピックに設定され 、設定されたキュー#をfalseに使用されている spring.jms.pub-サブドメイン=真 spring.activemq.user = ADMIN spring.activemq.password = ADMIN 使用#activemq設定クラス設定項目、カスタム接続プロジェクト、トピック仮想達成するために activemq.url = TCPを://10.195.229.8:61616 activemq.username = ADMIN activemq.password = ADMIN activemq.virtual.topic = VirtualTopic.Topic1 activemq.virtual.topic = Consumer.A.VirtualTopic.Topic1 II.A、 activemq.virtual.topic.B = Consumer.B.VirtualTopic.Topic1
- ActiveMQのコンフィギュレーションクラスは、植物は、サーバのActiveMQを複数接続するように構成することができます
springboot接続は、ActiveMQのアプリケーションによるプラントの構成に自動的に生成されますが、これは仮想接続ファクトリトピックを達成することはできません
springbootがベースなので spring.jms.pubサブドメイン。真のトピックが接続ファクトリを生成する場合、それは誤った接続キューの工場のために生成されます
パッケージcom.example.demo.config。 輸入org.apache.activemq.ActiveMQConnectionFactory; 輸入org.slf4j.Logger。 輸入org.slf4j.LoggerFactory; 輸入org.springframework.beans.factory.annotation.Qualifier; 輸入org.springframework.beans.factory.annotation.Value。 輸入org.springframework.context.annotation.Bean。 輸入org.springframework.context.annotation.Configuration。 輸入org.springframework.jms.annotation.EnableJms。 輸入org.springframework.jms.config.DefaultJmsListenerContainerFactory; 輸入org.springframework.scheduling.annotation.EnableAsync; 輸入javax.jms.ConnectionFactoryの。 / ** * @author * @versionのV1.0 * @modify:{}原因 * / @Configuration @EnableJms @EnableAsync パブリック クラスJmsConfig { @value( "$ {activemq.url}" ) プライベート文字列のURL。 @value( "$ {activemq.username}" ) プライベート文字列のユーザ名。 @value( "$ {activemq.password}" ) プライベート文字列のパスワード。 プライベートロガーロガー= LoggerFactory.getLogger(JmsConfig。クラス); @Bean(名 = "firstConnectionFactory" ) 公衆ActiveMQConnectionFactory firstConnectionFactory(){ ActiveMQConnectionFactoryはconnectionFactory = 新しいActiveMQConnectionFactory()。 connectionFactory.setBrokerURL(URL); connectionFactory.setUserName(ユーザー名); connectionFactory.setPassword(パスワード); 返却はconnectionFactoryを。 } // @Bean(名= "firstJmsTemplate") // 公衆JmsMessagingTemplate getFirstJmsTemplate(@Qualifier( "firstConnectionFactory")のConnectionFactoryはconnectionFactory){ // JmsMessagingTemplateテンプレート=新しいJmsMessagingTemplate(はconnectionFactory)。 // テンプレートを返します。 // } @Bean(名 = "firstTopicListener" ) 公衆 DefaultJmsListenerContainerFactory firstTopicListenerFactory(@Qualifier( "firstConnectionFactory" )のConnectionFactoryはconnectionFactory){ DefaultJmsListenerContainerFactory工場 = 新しいDefaultJmsListenerContainerFactory()。 factory.setConnectionFactory(はconnectionFactory)。 factory.setPubSubDomain(真の); リターン工場; } @Bean(名前= "firstQueueListener" ) 公衆 DefaultJmsListenerContainerFactory firstQueueTopicListenerFactory(@Qualifier( "firstConnectionFactory" )のConnectionFactoryはconnectionFactory){ DefaultJmsListenerContainerFactory工場 = 新しいDefaultJmsListenerContainerFactory()。 factory.setConnectionFactory(はconnectionFactory)。 リターン工場; } }
- プロデューサークラス
パッケージcom.example.demo.VirtualTopic; 輸入org.apache.activemq.command.ActiveMQTopic; 輸入org.slf4j.Logger。 輸入org.slf4j.LoggerFactory; 輸入org.springframework.beans.factory.annotation.Autowired; 輸入org.springframework.beans.factory.annotation.Value。 輸入org.springframework.jms.annotation.JmsListener。 輸入org.springframework.jms.core.JmsMessagingTemplate。 輸入org.springframework.scheduling.annotation.Async; 輸入org.springframework.web.bind.annotation.RequestMapping。 輸入org.springframework.web.bind.annotation.RequestMethod; 輸入org.springframework.web.bind.annotation.RestController。 輸入javax.jms.Destinationの。 輸入javax.jms.JMSException。 輸入javax.jms.Topicの; @RestController パブリック クラスProducerVirtualTopicController { @Autowired プライベートJmsMessagingTemplate jmsMessagingTemplate。 @RequestMapping(値 = "/ sendMessageVirtual"、メソッド= RequestMethod.GET) 公共 ボイドsendMessageVirtual(){ ため(int型 ; iは5 <I ++はI = 0 ){ // 虚拟トピック具有自己的命名规则 ActiveMQTopicトピック= 新しいですActiveMQTopic( "VirtualTopic.Topic1" ); この .jmsMessagingTemplate.convertAndSend(トピック、 "SSS" ); } } }
- 消費者
パッケージcom.example.demo.VirtualTopic; 輸入org.slf4j.Logger。 輸入org.slf4j.LoggerFactory; 輸入org.springframework.jms.annotation.JmsListener。 輸入org.springframework.scheduling.annotation.Async; 輸入org.springframework.stereotype.Component。 輸入javax.jms.JMSException。 @Component パブリック クラスコンシューマ{ プライベート 静的 最終ロガーロガー= LoggerFactory.getLogger(コンシューマ。クラス)。 @JmsListener(先 = "Consumer.B.VirtualTopic.Topic1"、containerFactory = "firstQueueListener") @Async 公共 ボイド receiveVTopicB(文字列メッセージ)がスローたJMSException { logger.debug( "VTopic B =====" + メッセージ)。 System.out.println( "VTopic B =======" + メッセージ)。 試す{ のThread.sleep( 500L )。 } キャッチ(InterruptedExceptionある電子){ e.printStackTrace(); } } @JmsListener(先 = "Consumer.A.VirtualTopic.Topic1"、containerFactory = "firstQueueListener" ) @Async 公共 ボイド receiveVTopicA1(文字列メッセージ)スローたJMSException { logger.debug( "VTopic A1 =====" + メッセージ)。 System.out.println( "VTopic A1 =======" + メッセージ)。 試す{ のThread.sleep( 500L )。 } キャッチ(InterruptedExceptionある電子){ e.printStackTrace(); } } @JmsListener(先 = "Consumer.A.VirtualTopic.Topic1"、containerFactory = "firstQueueListener" ) @Async 公共 ボイド receiveVTopicA2(文字列メッセージ)がスローたJMSException { logger.debugを("VTopic A2 =====" + メッセージ)。 System.out.println( "VTopic A2 =======" + メッセージ)。 試す{ のThread.sleep( 500L )。 } キャッチ(InterruptedExceptionある電子){ e.printStackTrace(); } } }
呼び出して、インターフェースのhttpをspringbootプロジェクトを開始:// localhostを:9090 / sendMessageVirtual 5つのメッセージに5つのメッセージにA1、A2、総消費するだけでなく、Bの消費量を見ることができます
4.まとめ
- シナリオ
プログラムは、複数のサーバ上に展開されるように、そこに同じプログラムの詳細ですが、必要と同じ手順メッセージを受信するだけで1を、VirtualTopicは、生産者がメッセージを送信するために、この問題を解決することですサーバー上のトピック、消費者に同じキューされているそれぞれの複数のサーバーにこれらのプログラムのための展開段階、およびその他の展開プログラムがまだ話題を聞いています。
- 仮想トピックの命名規則
トピック名:VirtualTopic.xxx
コンシューマ名:Consumer.yyy.VirtualTopic.xxx
https://www.jianshu.com/p/a924c30554caからの振替