Springboot が RabbitMQ メッセージキューを統合する方法

WBOY
リリース: 2023-05-13 22:55:13
転載
809 人が閲覧しました
    #プロデューサー プロジェクト

    POM 依存関係

    プロジェクトの作成時に依存関係を直接追加することを選択できます。

    Springboot が RabbitMQ メッセージキューを統合する方法

    Springboot が RabbitMQ メッセージキューを統合する方法アプリケーション ファイル

    rabbitmq にはデフォルトのアドレスとユーザー情報があるため、デフォルトのアドレスとユーザー情報がある場合は続行する必要はありません。ローカルのrabbitmq設定。

    Springboot が RabbitMQ メッセージキューを統合する方法

    Springboot が RabbitMQ メッセージキューを統合する方法

    RabbitMQ 設定ファイル:

    関連するスイッチとキューを使用する場合は、実装ではスイッチとキューを宣言します。対応する情報がない場合、起動プロジェクトは失敗します。したがって、springboot を使用して Rabbitmq を統合する場合、構成ファイルを使用してスイッチとキューを宣言し、この 2 つの間の関係をバインドできます。 Fanout モードは現在デモ中であるため、FanoutExchange を使用してスイッチを宣言し、他のモードでは対応する TopicExchange および DirectExchange を使用して宣言します。

    @Configuration
    public class RabbitMQConfiguration {
    
    //声明fanout模式的交换机
    @Bean
    public FanoutExchange fanoutExchange() {
        return new FanoutExchange("fanout_order_exchange", true, false);
    }
    
    //声明队列
    @Bean
    public Queue smsQueue() {
        return new Queue("sms.fanout.queue", true);
    }
    
    @Bean
    public Queue emailQueue() {
        return new Queue("email.fanout.queue", true);
    }
    
    @Bean
    public Queue duanxinQueue() {
        return new Queue("duanxin.fanout.queue", true);
    }
    //绑定
    
    @Bean
    public Binding smsBinding() {
        return BindingBuilder.bind(smsQueue()).to(fanoutExchange());
    }
    
    @Bean
    public Binding emailBinding() {
        return BindingBuilder.bind(emailQueue()).to(fanoutExchange());
    }
    
    @Bean
    public Binding duanxinBinding() {
        return BindingBuilder.bind(duanxinQueue()).to(fanoutExchange());
    }
    }
    ログイン後にコピー

    プロデューサー ビジネス コード

    コードのこの部分は、rabbitTemplate を呼び出してメッセージを配布するだけです。 @Service public class OrderService {
    @Autowired
    private RabbitTemplate rabbitTemplate;
    
    public void makeOrder() {
        // 保存订单
        String orderId = UUID.randomUUID().toString();
        System.out.println("下单成功:" + orderId);
        // 通过MQ完成消息的分发
        // 参数1:交换机 ;参数2:路由key/队列名;参数3:消息内容
        String exchangeName = "fanout_order_exchange";
        rabbitTemplate.convertAndSend(exchangeName, "", orderId);
    }
    }
    ログイン後にコピー

    Consumer:

    コンシューマ エンジニアリングはプロデューサー エンジニアリングに似ています。最初に依存関係を導入し、次にアプリケーションに関連する変更を加える必要があります。ファイル構成を変更してコードの記述を開始します。コンシューマ プロジェクトでは、rabbitmq 設定ファイルを記述してスイッチとキューを宣言することもできます。コンシューマ側は最初に起動するプロジェクトとなるため、スイッチやキューが作成されていないとプロジェクトの起動に失敗するため、コンシューマ側で設定ファイルを記述することを推奨します。メッセージのリスニング

    RabbitListener アノテーションを通じてメッセージ キューをリスニングします。コンポーネントアノテーションを通じて監視をスプリング管理に引き渡す必要があることに注意してください。そうしないと、サーバーからメッセージを正常に受信できません。ここでは、電子メール メッセージの監視を 1 つだけ指定します。上記のプロデューサーによって宣言された duanxin キューと SMS キューは、独自に作成できます。キュー名を変更するだけで済みます。 @Service public class OrderService {

    @RabbitListener(queues = {"email.fanout.queue"})
    @Component
    public class FanoutEmailService {
        @RabbitHandler
        public void receive(String message) {
            System.out.println("email fanout -----》接收到" + message);
        }
    }
    ログイン後にコピー

    Test

    まずコンシューマ プロジェクトを開始し、次にプロデューサ プロジェクト内にメッセージを送信するためのテスト クラスを作成します。

    @SpringBootTest class SpringbootOrderRabbitmqProducerApplicationTests {
    
    @Autowired
    private OrderService orderService;
    
    @Test
    void contextLoads() {
        orderService.makeOrder();
    }
    }
    ログイン後にコピー

    メッセージの送信後、コンシューマーがメッセージを正常に受け入れたことがコンソールでわかります。

    #ダイレクト モードSpringboot が RabbitMQ メッセージキューを統合する方法

    プロデューサー

    プロジェクトを作成する手順は上記と同じです。

    設定ファイル

    設定は基本的に上記と同じですが、この部分はダイレクトモードをテストするため、DirectExchangeを使用してスイッチを作成する必要があります。このクラスのメソッド名は、Bean アノテーションを使用して Spring 管理に引き渡すため、上記の Rabbitmq 設定ファイルのメソッド名と同じにすることはできないことに注意してください。名前が同じである場合、プロジェクトの起動は失敗。

    @Configuration
    public class DirectRabbitMQConfiguration {
    
    //声明direct模式的交换机
    @Bean
    public DirectExchange directExchange() {
        return new DirectExchange("direct_order_exchange", true, false);
    }
    
    //声明队列
    @Bean
    public Queue smsDirectQueue() {
        return new Queue("sms.direct.queue", true);
    }
    
    @Bean
    public Queue emailDirectQueue() {
        return new Queue("email.direct.queue", true);
    }
    
    @Bean
    public Queue duanxinDirectQueue() {
        return new Queue("duanxin.direct.queue", true);
    }
    //绑定
    
    @Bean
    public Binding smsDirectBinding() {
        return BindingBuilder.bind(smsDirectQueue()).to(directExchange()).with("sms");
    }
    
    @Bean
    public Binding emailDirectBinding() {
        return BindingBuilder.bind(emailDirectQueue()).to(directExchange()).with("email");
    }
    
    @Bean
    public Binding duanxinDirectBinding() {
        return BindingBuilder.bind(duanxinDirectQueue()).to(directExchange()).with("duanxin");
    }
    }
    ログイン後にコピー

    ビジネスコード

    @Service
    public class OrderService {
    
        @Autowired
        private RabbitTemplate rabbitTemplate;
    
        public void makeOrderDirect() {
            // 保存订单
            String orderId = UUID.randomUUID().toString();
            System.out.println("下单成功:" + orderId);
            String exchangeName = "direct_order_exchange";
            rabbitTemplate.convertAndSend(exchangeName, "sms", orderId);
            rabbitTemplate.convertAndSend(exchangeName, "email", orderId);
        }
    
    }
    ログイン後にコピー

    コンシューマ

    メッセージ監視

    は上記と同じですが、キュー名に注意してください。

    @RabbitListener(queues = {"email.direct.queue"})
    @Component
    public class DirectEmailService {
        @RabbitHandler
        public void receive(String message) {
            System.out.println("email direct -----》接收到" + message);
        }
    }
    ログイン後にコピー

    トピック モード

    上記のモードはすべて、設定ファイルを通じてスイッチ、キュー、バインディング間の関係を宣言します。実際、スイッチとアノテーションのアノテーションを通じて宣言することもできます。

    Producer

    アノテーションで宣言しているため、設定ファイルを作成する必要がなく、直接業務コードを記述することができます。テストする場合はルート名を変更するだけですが、変更方法の詳細は記事冒頭の各モードの使い方をご覧ください。

    @Service
    public class OrderService {
    
    @Autowired
    private RabbitTemplate rabbitTemplate;
    
    public void makeOrderTopic() {
        // 保存订单
        String orderId = UUID.randomUUID().toString();
        System.out.println("下单成功:" + orderId);
        String exchangeName = "topic_order_exchange";
        String routingKey = "com.email";
        rabbitTemplate.convertAndSend(exchangeName, routingKey, orderId);
    }
    }
    ログイン後にコピー
    Consumer

    コードは基本的に上記と同じですが、RabbitListener アノテーションでキューとスイッチを直接バインドしている点が異なります。各パラメータには文字列が使用されていることに注意してください。 value はキューに対応し、対応するパラメータはキュー名、永続化、および自動削除です。交換に対応するスイッチの場合、対応するパラメータはスイッチ名とスイッチの種類です。キーはルート名に対応します。

    rree

    以上がSpringboot が RabbitMQ メッセージキューを統合する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    関連ラベル:
    ソース:yisu.com
    このウェブサイトの声明
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
    人気のチュートリアル
    詳細>
    最新のダウンロード
    詳細>
    ウェブエフェクト
    公式サイト
    サイト素材
    フロントエンドテンプレート