什麼是直接模式(Direct)模式?
- 我們需要將消息發送給唯一一個節點時使用這種模式,這是最簡單的一種形式。
任何發送到Direct Exchange的消息都會被轉發到RouteKey 中指定的 Queue。
- 一般情況可以使用 rabbitMQ自帶的Exchange:""(改Excchange的名字爲空字符串,下文稱其爲default Exchange)。
- 這種模式下不需要將 Exchange 進行任何綁定(binding)操作。
- 消息傳遞時需要一個"RouteKey" ,可以簡單的理解爲要發送到的隊列名字。
- 如果Vhost 中不存在RouteKey 中指定的隊列名,則該消息會被拋棄。
1),創建Queue(隊列)如下
- Durability: 是否做持久化 Durable(持久) transient)(臨時)
- Auto delete : 是否自動刪除
2),創建一個maven的工程,並把工程修改爲springboot項目
2-1),pom添加依賴如下
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.1.RELEASE</version>
<relativePath/>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
2-2),resources 下面新建application.yml配置文件,並配置rabbitmq端口
spring:
rabbitmq:
host: 192.168.11.134
server:
port: 8001
2-3),新建springboot啓動類RabbitMQApplication如下
3),編寫消息生產者類 ProductTest ,如下在 test 模塊下
import com.mq.RabbitMQApplication;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
/** 消息生產者
* @author Administrator
* @version 1.0
* @date 2019/11/29 14:27
*/
@RunWith(SpringRunner.class)
@SpringBootTest(classes = RabbitMQApplication.class)
public class ProductTest {
@Autowired
private RabbitTemplate rabbitTemplate;
@Test
public void sendMessage(){
rabbitTemplate.convertAndSend("itcast","我要升職加薪,boss");
}
}
3-1),運行 sendMessage方法 查看是否localhost:15672 下的Queue是否有一條消息,如下
4),接下里編寫Customer類--消息消費者
/**
* 消費者
*
* @author Administrator
* @version 1.0
* @date 2019/11/29 14:32
*/
@Component
@RabbitListener(queues = "itcast")
public class Consumer {
@RabbitHandler
public void getMessage(String msg) {
System.out.println("直接模式消費者" + msg);
}
}
4-1),運行啓動類,可以在控制檯看到剛纔發送的消息,如下
問題發現
- 開啓多個消費者工程,測試運行消息生產者工程?
- 如何在 IDEA 中多次啓動同一個程序呢?
IDEA 多次啓用同一程序如下 勾選 Allow parallel run 上允許並行運行如下
1),第一次啓動springboot 工程 application.yml 端口爲 8001 並把getMessage方法輸出內容改爲
System.out.println("直接模式消費者111" + msg);
2),把application.yml 改爲 8002 並把getMessage方法輸出內容改爲
System.out.println("直接模式消費者222" + msg);
2),把application.yml 改爲 8003 並把getMessage方法輸出內容改爲
System.out.println("直接模式消費者333" + msg);
2),我們使用生產者的測試方法來進行消息的生產,測試如下
第一條消息被8001 所消費
第二條消息被8002所消費
生產者的第三條消息被8003所消費
發現了什麼
- RabbitMQ 自身使用負載均衡,好處是 不會使其中一臺服務器壓力過大,多臺服務器進行平攤壓力