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