欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

RabbitMQ的直接模式(Direct)

程序员文章站 2022-07-13 21:28:36
...

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

  • 我们需要将消息发送给唯一一个节点时使用这种模式,这是最简单的一种形式。

                               RabbitMQ的直接模式(Direct)

 

任何发送到Direct Exchange的消息都会被转发到RouteKey 中指定的 Queue。

  1. 一般情况可以使用 rabbitMQ自带的Exchange:""(改Excchange的名字为空字符串,下文称其为default Exchange)。
  2. 这种模式下不需要将 Exchange 进行任何绑定(binding)操作。
  3. 消息传递时需要一个"RouteKey" ,可以简单的理解为要发送到的队列名字。
  4. 如果Vhost 中不存在RouteKey 中指定的队列名,则该消息会被抛弃。

 

1),创建Queue(队列)如下

 

RabbitMQ的直接模式(Direct)

  •  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如下

RabbitMQ的直接模式(Direct)

 

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是否有一条消息,如下

 

RabbitMQ的直接模式(Direct)

 

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),运行启动类,可以在控制台看到刚才发送的消息,如下

 

RabbitMQ的直接模式(Direct)

 

 

问题发现

  • 开启多个消费者工程,测试运行消息生产者工程?
  • 如何在 IDEA 中多次启动同一个程序呢?

IDEA 多次启用同一程序如下  勾选 Allow parallel run 上允许并行运行如下

RabbitMQ的直接模式(Direct)

 

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 所消费

RabbitMQ的直接模式(Direct)

第二条消息被8002所消费

RabbitMQ的直接模式(Direct)生产者的第三条消息被8003所消费

RabbitMQ的直接模式(Direct)

发现了什么

  • RabbitMQ 自身使用负载均衡,好处是 不会使其中一台服务器压力过大,多台服务器进行平摊压力