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
扫描二维码关注公众号,回复: 10564921 查看本文章

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 自身使用负载均衡,好处是 不会使其中一台服务器压力过大,多台服务器进行平摊压力
发布了256 篇原创文章 · 获赞 188 · 访问量 65万+

猜你喜欢

转载自blog.csdn.net/qq_40646143/article/details/103310638
今日推荐