RabbitMQ的直接模式(Direct)

什麼是直接模式(Direct)模式?

  • 我們需要將消息發送給唯一一個節點時使用這種模式,這是最簡單的一種形式。

                               

 

任何發送到Direct Exchange的消息都會被轉發到RouteKey 中指定的 Queue。

  1. 一般情況可以使用 rabbitMQ自帶的Exchange:""(改Excchange的名字爲空字符串,下文稱其爲default Exchange)。
  2. 這種模式下不需要將 Exchange 進行任何綁定(binding)操作。
  3. 消息傳遞時需要一個"RouteKey" ,可以簡單的理解爲要發送到的隊列名字。
  4. 如果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 自身使用負載均衡,好處是 不會使其中一臺服務器壓力過大,多臺服務器進行平攤壓力

 

 

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