AcitvieMQ-VirtualTopic springboot統合により、仮想トピックをActiveMQの

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からの振替

おすすめ

転載: www.cnblogs.com/heamin/p/11455203.html