スリー人気のRabbitMQの交換スイッチ

まず第一に:コードバージョンはSpring2.1.12 +ラビット達成統合に基づいています

ウサギ:POM

        <!-- rabbitmq -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>

ウサギ:YML配置

server:
  port: 8600
spring:
  application:
    name: rabbitmq-provider
  rabbitmq:
    host: 192.168.189.131
    port: 5673
    username: admin
    password: admin
    #确认消息已发送到交换机(Exchange)
    publisher-confirms: true
    #确认消息已发送到队列(Queue)
    publisher-returns: true

 

 

1:直接交換ダイレクト・スイッチ

定義:キュー・バインディングを持つスイッチのダイレクトコネクトタイプは、明示的な結合キーを指定する必要があります。

メッセージを受信するために、発見、直接スイッチの種類に接続されたメッセージ、そして唯一のキーバインディングキー完全一致をルーティング、バインドされたキュー:ルールをルーティング。

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw ==uploading.4e448015.gifダンプは失敗した再アップロードをキャンセルwAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw ==

 

DirectRabbitConfig
@Configuration
public class DirectRabbitConfig {
    //队列 起名:TestDirectQueue
    @Bean
    public Queue TestDirectQueue() {
        return new Queue("TestDirectQueue",true);
    }

    //Direct交换机 起名:TestDirectExchange
    @Bean
    DirectExchange TestDirectExchange() {
        return new DirectExchange("TestDirectExchange");
    }

    //绑定  将队列和交换机绑定, 并设置用于匹配键:TestDirectRouting
    @Bean
    Binding bindingDirect() {
        return BindingBuilder.bind(TestDirectQueue()).to(TestDirectExchange()).with("TestDirectRouting");
    }

}
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw ==uploading.4e448015.gifダンプは失敗した再アップロードをキャンセル wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw ==
DirectRabbitController
@RestController
public class DirectRabbitController {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    @GetMapping("/sendDirectMessage/{message}")
    public void sendDirectMessage(@PathVariable("message") String message){
        String messageId = String.valueOf(UUID.randomUUID());
        String messageData = message;
        String createTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        Map<String,Object> map=new HashMap<>();
        map.put("messageId",messageId);
        map.put("messageData",messageData);
        map.put("createTime",createTime);
        rabbitTemplate.convertAndSend("TestDirectExchange", "TestDirectRouting", map);
    }

    @RabbitListener(queues = "TestDirectQueue")
    public void consumerDirectMessage(Map map){
        System.out.println("DirectReceiver消费者收到消息  : " + map.toString());
    }

}
 

2、トピック為替テーマスイッチ

定義:キュー結合ルーティング鍵を有する被験体型スイッチは、パターンマッチングによって特定することができます。

2つのワイルドカードがありますが、*一致する単語を表します。#マッチゼロ以上の単語を代表して。区切られています。単語の間。

ルーティングルール:メッセージを受信するには、キーパターンをキーバインディングアコードをルーティング、スイッチの話題タイプにバインドされたキューをメッセージを送信します。

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw ==uploading.4e448015.gifダンプは失敗した再アップロードをキャンセルwAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw ==

TopicRabbitConfig
@Configuration
public class TopicRabbitConfig {
    public final static String man = "topic.man";
    public final static String woman = "topic.woman";

    @Bean
    public Queue firstQueue() {
        return new Queue(TopicRabbitConfig.man);
    }

    @Bean
    public Queue secondQueue() {
        return new Queue(TopicRabbitConfig.woman);
    }

    @Bean
    public TopicExchange exchange() {
        return new TopicExchange("topicExchange");
    }

    //将firstQueue和topicExchange绑定,而且绑定的键值为topic.man
    //这样只要是消息携带的路由键是topic.man,才会分发到该队列
    @Bean
    Binding bindingExchangeMessage() {
        return BindingBuilder.bind(firstQueue()).to(exchange()).with(man);
    }

    //将secondQueue和topicExchange绑定,而且绑定的键值为用上通配路由键规则topic.#
    // 这样只要是消息携带的路由键是以topic.开头,都会分发到该队列
    @Bean
    Binding bindingExchangeMessage2() {
        return BindingBuilder.bind(secondQueue()).to(exchange()).with("topic.#");
    }

}

 

TopicRabbitController
@RestController
public class TopicRabbitController {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    @GetMapping("/sendTopicFirst")
    public String sendTopicMessage1() {
        String messageId = String.valueOf(UUID.randomUUID());
        String messageData = "message: M A N ";
        String createTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        Map<String, Object> manMap = new HashMap<>();
        manMap.put("messageId", messageId);
        manMap.put("messageData", messageData);
        manMap.put("createTime", createTime);
        rabbitTemplate.convertAndSend("topicExchange", "topic.man", manMap);
        return "ok";
    }

    @GetMapping("/sendTopicSecond")
    public String sendTopicSecond() {
        String messageId = String.valueOf(UUID.randomUUID());
        String messageData = "message: woman is all ";
        String createTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        Map<String, Object> womanMap = new HashMap<>();
        womanMap.put("messageId", messageId);
        womanMap.put("messageData", messageData);
        womanMap.put("createTime", createTime);
        rabbitTemplate.convertAndSend("topicExchange", "topic.woman", womanMap);
        return "ok";
    }

    @RabbitListener(queues = "topic.man")
    public void topicManReceiver(Map map){
        System.out.println("topicManReceiver消费者收到消息  : " + map.toString());
    }

    @RabbitListener(queues = "topic.woman")
    public void topicWomenReceiver(Map map){
        System.out.println("topicWomenReceiver消费者收到消息  : " + map.toString());
    }

}

3、ファンアウト交換放送スイッチ

定義:ブロードキャスト型スイッチとバインドされたキューは、結合キーを指定する必要はありません。

ルーティングルール:ブロードキャストメッセージは、スイッチの種類に送信されると、そのすべてがメッセージキューを受け取ることができますバインドされ、ルーティングのキーを指定する必要はありません。

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw ==uploading.4e448015.gifダンプは失敗した再アップロードをキャンセルwAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw ==

 

FanoutRabbitConfig
@Configuration
public class FanoutRabbitConfig {
    /**
     *  创建三个队列 :fanout.A   fanout.B  fanout.C
     *  将三个队列都绑定在交换机 fanoutExchange 上
     *  因为是扇型交换机, 路由键无需配置,配置也不起作用
     */
    @Bean
    public Queue queueA() {
        return new Queue("fanout.A");
    }

    @Bean
    public Queue queueB() {
        return new Queue("fanout.B");
    }

    @Bean
    public Queue queueC() {
        return new Queue("fanout.C");
    }

    @Bean
    FanoutExchange fanoutExchange() {
        return new FanoutExchange("fanoutExchange");
    }

    @Bean
    Binding bindingExchangeA() {
        return BindingBuilder.bind(queueA()).to(fanoutExchange());
    }

    @Bean
    Binding bindingExchangeB() {
        return BindingBuilder.bind(queueB()).to(fanoutExchange());
    }

    @Bean
    Binding bindingExchangeC() {
        return BindingBuilder.bind(queueC()).to(fanoutExchange());
    }

}
FanoutRabbitController
@RestController
public class FanoutRabbitController {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    @GetMapping("/sendFanoutMessage")
    public String sendFanoutMessage() {
        String messageId = String.valueOf(UUID.randomUUID());
        String messageData = "message: testFanoutMessage ";
        String createTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        Map<String, Object> map = new HashMap<>();
        map.put("messageId", messageId);
        map.put("messageData", messageData);
        map.put("createTime", createTime);
        rabbitTemplate.convertAndSend("fanoutExchange", null, map);
        return "ok";
    }

    @RabbitListener(queues = "fanout.A")
    public void FanoutReceiverA(Map testMessage){
        System.out.println("FanoutReceiverA消费者收到消息  : " +testMessage.toString());
    }

    @RabbitListener(queues = "fanout.B")
    public void FanoutReceiverB(Map testMessage){
        System.out.println("FanoutReceiverB消费者收到消息  : " +testMessage.toString());
    }

    @RabbitListener(queues = "fanout.C")
    public void FanoutReceiverC(Map testMessage){
        System.out.println("FanoutReceiverC消费者收到消息  : " +testMessage.toString());
    }

}

 

 

公開された33元の記事 ウォンの賞賛3 ビュー5846

おすすめ

転載: blog.csdn.net/WandaZw/article/details/105347711