RabbitMQ:交換機

交換機分爲6種,分別爲直流交換機,主題交換機,扇形交換機,首部交換機,默認交換機,死信交換機

流程
在這裏插入圖片描述

綜合交換機的使用
rabbitmq_01 主模塊
rabbitmq-provider 子模塊
rabbitmq-consumer 子模塊

在子模塊的pom文件中導入依賴

<dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-amqp</artifactId>
     </dependency>
     <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-web</artifactId>
     </dependency>
     <dependency>
       <groupId>org.projectlombok</groupId>
       <artifactId>lombok</artifactId>
       <optional>true</optional>
     </dependency>

修改application.ym文件

server:
  port: 8081
  servlet:
    context-path: /
spring:
  rabbitmq:
  #你自己的宿主機IP
    host: 192.168.233.130
    virtual-host: my_vhost
    #你的用戶名
    username: tina
    #你的密碼
    password: 123456
    port: 5672

啓動虛擬機,進入網站
http://[宿主機IP]:15672
登錄進去

1.直流交換機(Direct Exchange )
a.子模塊生產者中創建rabbitmq包創建類RabbitmqDirectConfig

package com.hlp.rabbitmq;

import com.rabbitmq.client.AMQP;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitmqDirectConfig {
    /*
    *隊列
    *  */
    @Bean
    public Queue queue1(){
        return new Queue("queue1");
    }

    /*
    * 直連交換器
    * */
    @Bean
    public DirectExchange directExchange(){
        return new DirectExchange("directExchange");
    }

    /*
    * 綁定
    * */
    @Bean
    public Binding binding(){
        Binding binding= BindingBuilder.bind(queue1()).to(directExchange()).with("routing01");
        return binding;
    }
}

b.弄一個controller包,創建一個controller類(我這直接把主題,扇形的controller內容都寫了,這裏只要寫直流交換器的就好了,後面有關這個累的只提一下)

package com.hlp.controller;

import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

@RestController
public class SendController {
    @Autowired
  private RabbitTemplate rabbitTemplate;
    /*
    *
    * 直連交換機*/
    @RequestMapping("/rabbit01")
    public String RabbitmqTest(){
        rabbitTemplate.convertAndSend("directExchange","routing01",getData());
    return "success";
    }

    /*
    *
    * 主題交換機*/
    @RequestMapping("/rabbit02")
    public String RabbitmqTest01(String routing){
        rabbitTemplate.convertAndSend("topicExchange",routing,getData());
        return "success01";
    }

    /*
     *
     * 扇形交換機*/
    @RequestMapping("/rabbit03")
    public String RabbitmqTest02(){
        rabbitTemplate.convertAndSend("fanoutExchange",null,getData());
        return "success02";
    }


    public Map<String,String> getData(){
        Map<String,String> map=new HashMap<>();
        map.put("id","1");
        map.put("name","tomcat");
        map.put("content","Direct");
        return map;
    }
}

然後以上弄好之後運行在網頁中運行,然後再到官網看結果,就會發現原先的內容從0變成1,接下來我們去子模塊消費者中寫內容去消費它

創建rabbitmq包
1.創建DirectExchangeReciver類

package com.hlp.rabbitmq;

import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import java.util.Map;

@Component
@RabbitListener(queues = {"queue1"})
public class DirectExchangeReciver {

    @RabbitHandler
    public void reciver(Map<String,String> map){
        System.out.println(map);
    }
}

2.主題交換機
與直流交換機寫法大致相同,只是在路由鍵處比較靈活使用的是“ .#.
我這裏主要把RabbitmqTopicConfig類顯示

package com.hlp.rabbitmq;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitmqTopicConfig {

    /*
    * 隊列
    * */
    @Bean
    public Queue queueA(){
        return new Queue("queueA");
    }
    @Bean
    public Queue queueB(){
        return new Queue("queueB");
    }
    @Bean
    public Queue queueC(){
        return new Queue("queueC");
    }

    /*
    *主題交換機
    * */
    @Bean
    public TopicExchange topicExchange(){
       return new TopicExchange("topicExchange");
    }

    /*
    * 綁定
    * */
    @Bean
    public Binding binding01(){
        Binding binding= BindingBuilder.bind(queueA()).to(topicExchange()).with("route.people.queueA");
       return binding;
    }
    @Bean
    public Binding binding02(){
        Binding binding= BindingBuilder.bind(queueB()).to(topicExchange()).with("route.people.queueB");
        return binding;
    }
    @Bean
    public Binding binding03(){
        Binding binding= BindingBuilder.bind(queueC()).to(topicExchange()).with("route.people.*");
        return binding;
    }

}

controller請看直流交換器處
消費者沒什麼不同,唯一不同的就是隊列名稱,以及需要寫三個接收類

3.扇形交換器,與以上兩個交換器不同處爲沒有路由鍵。這裏就不寫了注意就可以了
默認交換器其實質上也就是直流交換器
剩下的三個不怎麼使用這裏就沒有使用了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章